C语言科学记数法问题

时间:2016-01-26 19:55:12

标签: c floating-point

我有以下程序:

float x = 3.e17;
printf("x = %f", x);

给出了结果:

x = 299999995292024832.000000

为什么结果不是300000000000000000.000000?

2 个答案:

答案 0 :(得分:1)

由于浮动精度有限。使用double可获得更高的精度,但浮点并不总是精确的

答案 1 :(得分:1)

factory :user do
  ...
  confirmed_at DateTime.now
end

(是的,这是一种使用联盟的错误/无效方式,但它恰好起作用了)

#include <stdio.h>
#include <stdlib.h>

union
{
    double d;
    float f;
    unsigned int ui[2];
} myun;

int main ( void )
{
    float  fx = 3.e17;
    double dx = 3.e17;
    printf("fx %f\n",fx);
    printf("dx %lf\n",dx);
    myun.f=fx;
    printf("fx 0x%08X\n",myun.ui[0]);
    myun.ui[0]++;
    printf("fx %lf\n",myun.f);
    myun.d=dx;
    printf("dx 0x%08X 0x%08X\n",myun.ui[1],myun.ui[0]);
    return(0);
}

维基百科指出,单人可以处理多达9位数而不会损失精确度并且可以加倍15-17。所以你的答案是肯定的,不一定需要做一个实验。