Previous: , Up: General Arithmetic   [Contents][Index]

#### 15.1.2 Mixing Integers And Floating-point

As has been mentioned already, `awk` uses hardware double precision with 64-bit IEEE binary floating-point representation for numbers on most systems. A large integer like 9,007,199,254,740,997 has a binary representation that, although finite, is more than 53 bits long; it must also be rounded to 53 bits. The biggest integer that can be stored in a C `double` is usually the same as the largest possible value of a `double`. If your system `double` is an IEEE 64-bit `double`, this largest possible value is an integer and can be represented precisely. What more should one know about integers?

If you want to know what is the largest integer, such that it and all smaller integers can be stored in 64-bit doubles without losing precision, then the answer is 2^53. The next representable number is the even number 2^53 + 2, meaning it is unlikely that you will be able to make `gawk` print 2^53 + 1 in integer format. The range of integers exactly representable by a 64-bit double is [-2^53, 2^53]. If you ever see an integer outside this range in `awk` using 64-bit doubles, you have reason to be very suspicious about the accuracy of the output. Here is a simple program with erroneous output:

```\$ gawk 'BEGIN { i = 2^53 - 1; for (j = 0; j < 4; j++) print i + j }'
-| 9007199254740991
-| 9007199254740992
-| 9007199254740992
-| 9007199254740994
```

The lesson is to not assume that any large integer printed by `awk` represents an exact result from your computation, especially if it wraps around on your screen.