Previous: Floating Point Issues, Up: General Arithmetic [Contents][Index]

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.