浮动操作如何在c中起作用?大数字怪异的结果

时间:2013-04-03 09:01:53

标签: c floating-point

以下代码给出了一些奇怪的结果:

#include <stdio.h>
#include <float.h>

int main()
{
    float t = 1.0;  
    float res;
    float myFltMax = 340282346638528859.0;
    printf("FLT_MAX %f\n", FLT_MAX);

    res = FLT_MAX - t;
    printf("res %f\n", res);

    res = myFltMax - t;
    printf("res myFltMax %f\n", res);

    return 1;

}

结果是:

FLT_MAX 340282346638528859811704183484516925440.000000
res 340282346638528859811704183484516925440.000000
res myFltMax 340282356122255360.000000

因此,如果我从FLT_MAX中减去1,结果是相同的,如果我从其他大浮点数中减去1,则结果大于初始数。

我使用的是gcc 4.7.2版。 谢谢。

1 个答案:

答案 0 :(得分:3)

如果从myFltMax中减去1,则不会得到大于初始数字的差异。你得到相同的号码。同时打印myFltMax,您会看到它是340282356122255360而不是340282346638528859

Proof

基本上,编译器将340282346638528859四舍五入到可以浮点类型表示的最接近的值,恰好是340282356122255360