6

10 進数は 2 進数システムで浮動小数点数として正確に格納できることはわかっていますが、10/7 の出力の小数点以下 7 桁で何が起こっているのか理解できません。

最初の出力テストで、フロートの最後の 5 (7 位) と 4 (7 位) の後に 2 が続くことに気付きました。ダブルスの 8 位は 2 なので、フロートの 7 位は 4 になると思います。

フロート 1.4285715 ダブル 1.4285714285714286

次に、float 形式を使用して次の出力テストを 17 桁まで実行しました。それぞれの 8 位は異なります。フロートは 6 であるため、7 位は 5 に丸められます。

Float 1.428571462631225600 Double 1.428571428571428600

3 番目の出力テストでは、文字列形式で直接キャストして、何が起こるかを確認しました。2回目のテストと同じ結果が得られました。

複雑な浮動小数点ストレージ メソッドに対する単純な質問がある場合は、お詫び申し上げます。

    float f = 10/7f;
    double d = 10/7d;

    System.out.format
        ("Float  %1s\nDouble %2s\n", f,d);
    /*
     *  Float  1.4285715
        Double 1.4285714285714286
     */

    System.out.format
        ("Float  %1$.17f\nDouble %2$.17f\n", f,d);
    /*
     *  Float  1.428571462631225600
        Double 1.428571428571428600
     */

    System.out.format
        ("Float  %1s\nDouble %2s\n", (double)f,d);
    /*
     *  Float  1.4285714626312256
        Double 1.4285714285714286
     */
4

4 に答える 4

7

最初の出力テストで、フロートの最後の 5 (7 位) と 4 (7 位) の後に 2 が続くことに気付きました。ダブルスの 8 位は 2 なので、フロートの 7 位は 4 になると思います。

この期待は、float が 10 進数で内部的に格納され、小数点以下の桁数に丸められると考える場合にのみ意味があります。しかし、これは正しくありません。float は内部的に 2 進数で格納され、いくつかの2 進数に丸められます。

あなたの期待は、浮動小数点数がどのように格納されるかについての誤解に基づいています。double の方が小数点以下の桁数がより正確であることがわかりますが、これは、double の方がより正確な 2 進数の桁を持っているためです。実装では、数値を 10 進数形式で格納することはまったくありません。

于 2012-01-30T20:12:00.183 に答える
3

Javaは、浮動小数点数を表すためにIEEE-754を使用しますIEEE-754標準の詳細については、多くの場所で読むことができます。

于 2012-01-30T19:53:23.790 に答える
2

簡単な説明については、このサイトを試してください。

http://floating-point-gui.de/basic/

非常に詳細な説明については、これを試してください。

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2012-01-30T19:55:02.703 に答える
1

a を使用するfloatと、この数値に 8 桁のデフォルト精度が使用されるようです。double精度を指定すると、値の計算に実際に使用されることが明確になります。

于 2012-01-30T19:55:42.577 に答える