レポート

次のプログラム
#include <stdio.h>

int main()
{
    volatile double a = 5000000000000001.;
    volatile double b = 0.499755859375;

    printf("%.80g\n", a);
    printf("%.80g\n", b);

    printf("%.80g\n", a + b);

    return 0;
}
を、IntelのCPUでLinuxの32bit環境 (あるいは64bit環境で-m32オプションでコンパイル) したとき、本来の計算結果である
5000000000000001
でなく、
5000000000000002
と繰り上がってしまう現象が見られる。 すなわち、IEEE 754 Std.に従っていない。

この現象が起きる原因について考察せよ。 解決策についても考察せよ。


レポート