Does C round floating-point constants

2019-06-18 04:36发布

A question about floating-point precision in Go made me wonder how C handles the problem.

With the following code in C:

float a = 0.1;

Will a have the closest IEEE 754 binary representation of:

00111101110011001100110011001101 (Decimal:  0.10000000149011612)

or will it just crop it to:

00111101110011001100110011001100 (Decimal:  0.09999999403953552)

Or will it differ depending on compiler/platform?

2条回答
▲ chillily
2楼-- · 2019-06-18 05:07

An implementation is allowed to do either (or even be off by one more):

For decimal floating constants, and also for hexadecimal floating constants when FLT_RADIX is not a power of 2, the result is either the nearest representable value, or the larger or smaller representable value immediately adjacent to the nearest representable value, chosen in an implementation-defined manner.

(C11, §6.4.4.2/3)

Since C99, we've had hexadecimal floating point constants so that you can specify precisely the bits you want (assuming that the implementation offers binary floating point :) ), so you could have said, for example:

float a = 0x1.99999Ap-4;

For IEEE 754 32-bit floats:

#include <stdio.h>
int main() {
  float a = 0.1;
  float low  = 0x0.1999999p0;
  float best = 0x0.199999ap0;
  float high = 0x0.199999bp0;
  printf("a is %.6a or %.16f, which is either %.16f, %.16f or %.16f\n",
          a, a, low, best, high);
  return 0;
}
查看更多
Fickle 薄情
3楼-- · 2019-06-18 05:09

Unspecified by the standard, but testing on some local hardware:

#include <stdio.h>

int
main( int argc, char **argv )
{
float   a = 0.1;
double  b = a;

printf("%.16f\n", b );
}

0.1000000014901161

查看更多
登录 后发表回答