为什么最右边的数字不是零(C/Linux)?

Jef*_*eff 3 c floating-point

如果你打印的浮点数比存储在存储器中的精度更高,那么它们不应该是额外的零点吗?我有这样的代码:

double z[2*N]="0";
...
for( n=1; n<=2*N; n++) {
  fprintf( u1, "%.25g", z[n-1]);
  fputc( n<2*N ? ',' : '\n', u1);
}
Run Code Online (Sandbox Code Playgroud)

这是创建这样的输出:

0,0.7071067811865474617150085,....

一个浮点数应该只有17个小数位(右边?不是53位到17个小数位).如果是这样的话,那么第18,19 ...... 25位应该有零.请注意,在上面的输出中,它们的数字不是0.

我误会了什么吗?如果是这样,什么?

tjl*_*tjl 7

不,53位意味着17个小数位是你可以信任的,但是因为我们使用的base-10表示法存在于双精度存储的二进制基数(二进制),后面的数字只是因为1/2 53不完全是1/10 ^ n,即

1/2 ^ 53 = .000000000000000111022302462515654042363166809082031250000000000000000

  • IEEE 754浮点标准定义了一个浮点数,用于表示**由其符号,指数和有效数定义的值.您可以信任的小数位数完全取决于您如何生成数字,而不是大致接近53位的小数位数.如果您通过精确的方式生成数字,那么**可以信任将值转换为十进制的每个**十进制数字.如果您通过具有许多舍入误差的不良近似值生成数字,则可以信任很少或没有十进制数字. (2认同)