違いは、80ビット浮動小数点値から80ビット浮動小数点値への変換と64ビット値への変換で、からに変換することが長いと思われます。
(80ビットが全く来た理由は、それが実際の演算に使用される典型的な精度であるということであり、浮動小数点レジスタの幅。)
は、80ビットの結果が10.999999999999999ようなものであると仮定 - しかし、80ビットの値に最も近い64ビットの浮動小数点値は実際には11.0なので、2段階の変換は11になります。
EDIT:これを与えるには、次のようにします。より多くの重量を...
ここでは、任意精度の算術演算を使用してsamを実行するJavaプログラムですe計算。これは0.1に最も近いdouble値をBigDecimalに変換することに注意してください。その値は0.1000000000000000055511151231257827021181583404541015625です。 (換言すれば、計算の正確な結果がとにかくない 11である)
import java.math.*;
public class Test
{
public static void main(String[] args)
{
BigDecimal c = new BigDecimal(0.1d);
BigDecimal a = new BigDecimal(1d);
BigDecimal b = new BigDecimal(2d);
BigDecimal result = b.subtract(a)
.add(c)
.divide(c, 40, RoundingMode.FLOOR);
System.out.println(result);
}
}
ここで結果は次のとおりすなわち
10.9999999999999994448884876874217606030632
は、その途中(約40桁に正しいです64ビットまたは80ビット浮動小数点以上が処理可能)。
ここでは、この番号がバイナリでどのように見えるかを考えてみましょう。私は簡単に変換を行うためのツールはありませんが、再びJavaを使用して手助けすることができます。正規化された数を仮定すると、 "10"部分は3ビットを使用して終了する(1つは1111 = 1011未満である)。これは、拡張精度(80ビット)と倍精度(64ビット)のための48ビットのために60ビットの仮数を残す。
したがって、精度ごとに11に最も近い数字は何ですか?ここでも、のは、Javaを使ってみましょう:
import java.math.*;
public class Test
{
public static void main(String[] args)
{
BigDecimal half = new BigDecimal("0.5");
BigDecimal eleven = new BigDecimal(11);
System.out.println(eleven.subtract(half.pow(60)));
System.out.println(eleven.subtract(half.pow(48)));
}
}
結果:
10.999999999999999999132638262011596452794037759304046630859375
10.999999999999996447286321199499070644378662109375
そこで、我々が持っている3つの数字は、以下のとおりです。
Correct value: 10.999999999999999444888487687421760603063...
11-2^(-60): 10.999999999999999999132638262011596452794037759304046630859375
11-2^(-48): 10.999999999999996447286321199499070644378662109375
は今、正しいものに最も近い値をうまく精度ごとに、精度は11以下です。これらの値のそれぞれをlongにすると、それぞれ10と11になります。
がうまくいけば、これは懐疑を説得するのに十分な証拠である。)
私のシステムでは同じ(両方とも11)ですか? –
これは何をコンパイルしていますか? – Joseph
ちょっと面白くて、eをローカル変数にして、それが変わるかどうかを調べてみてください。 –