3

次のコードを実行する場合:

public class FPoint {
    public static void main(String[] args) {
        float f = 0.1f;
        for(int i = 0; i<9; i++) {
            f += 0.1f;
        }
        System.out.println(f);
    }
}

次の出力が表示されます。

1.0000001

しかし、出力は1.0000000になるはずですよね?間違っていたら訂正してください..!!

4

4 に答える 4

8

IEEE 754 規格では、0.1 は実際には「0.1」ではありません。

0.1 がコード化されます : 0 01111011 10011001100110011001101(浮動小数点数付き)

  • 0 は符号 (= 正)
  • 01111011 指数 (= 123 -> 123 - 127 = -4 (127 は IEEE 754 のバイアス))
  • 10011001100110011001101 仮数

仮数を 10 進数に変換するには、1.10011001100110011001101*2^ -4 (base2) [1.xxx は IEEE 754 で暗黙的です]

= 0.000110011001100110011001101(底2)

= 1/2^4 + 1/2^5 + 1/2^8 + 1/2^9 + 1/2^12 + 1/2^13 + 1/2^16 + 1/2^17 + 1 /2^20 + 1/2^21 + 1/2^24 + 1/2^25 + 1/2^27 (base10)

= 1/16 + 1/32 + 1/256 + 1/512 + 1/4096 + 1/8192 + 1/65536 + 1/131072 ...(base10)

= 0.10000000149011612 (base10)

于 2013-09-30T07:18:41.413 に答える