5

これは好奇心からです。2つの再帰数または無理数を2つのdoubleに格納してからいくつかの演算を実行すると、実際の結果はどのように生成されますか?

例えば、

double d1=7d/3;
double d2=5d/3;
double sum=d1+d2;
System.out.println(new BigDecimal(sum)); //prints exactly 4

もう1つ:

double d1=log10(3);
double value=Math.pow(10,d1);
System.out.println(new BigDecimal(value)); //prints exactly 3

これらの正確な結果はどのように生成されますか?

4

1 に答える 1

5

コードを少し修正すると、それがわかりますが、正確にはまたはではd1ありd2ません。が正確である理由は、正確にdoubleとして表すことができ、この加算の正確な結果に最も近いためです。7/35/3d1+d244

public static void main(String[] args) throws Exception {
    double d1 = 7d / 3;
    double d2 = 5d / 3;
    System.out.println(new BigDecimal(d1)); //2.333333333333333481363069950020872056484222412109375
    System.out.println(new BigDecimal(d2)); //1.6666666666666667406815349750104360282421112060546875
    System.out.println(new BigDecimal(d1).add(new BigDecimal(d2))); //4.0000000000000002220446049250313080847263336181640625
    double sum = d1 + d2; 
    System.out.println(new BigDecimal(sum)); //4
}

JavaはIEEE754規則に従います

合計は、IEEE754の最も近い丸めモードを使用して選択された値セットの最も近い値に丸められます。

于 2012-10-20T07:03:35.413 に答える