doubleの最大精度を決定しようとしています。このリンクで受け入れられた回答のコメントRetain precision with double in Java @PeterLawreyは15で最大精度を述べています。doubleの最大精度を決定する方法
これはどのようにして決定しますか?直接
doubleの最大精度を決定しようとしています。このリンクで受け入れられた回答のコメントRetain precision with double in Java @PeterLawreyは15で最大精度を述べています。doubleの最大精度を決定する方法
これはどのようにして決定しますか?直接
@PeterLawreyは、彼がすべてで述べたものを実際にはありません15.
で最大の精度を述べています。彼が述べたことだった。
は、二重精度
の15小数点以下の桁数を持っており、彼は間違っています。彼らは15桁の数字の精度を持っています。
任意の数の桁数をベースに、そのログによって与えられる10. 15は、仮数のビット数である53ログ(2 -1)、床の値でありますJavadocおよびIEEE 754に記載されているように(暗黙のビットを含む)、そして2 -1は、可能な最大仮数値である。実際の値は、Windows電卓の限界まで15.954589770191003298111788092734です。
彼は「精度の小数点以下の桁」と表現するのは間違いです。 double
は、すべてが小数点の前にある場合は、の数字15桁、精度のの精度を持ちます。小数部を持つ数値の場合、10進表記では15桁を超える数を得ることができます。
ありがとうございました。しかし、2^53の最大仮数値は15桁を意味しますか? –
任意の数値の小数点以下の桁数は、その基数10のログによって与えられます。 – EJP
「直線対数引数」は、整数にのみ適用されます。これはおそらく最後の段落で何を示しているのでしょうか。浮動小数点の場合、私がここで行うような派生をしなければなりません:http://www.exploringbinary.com/number-of-digits-required-for-round-trip-conversions/。ダブルスの場合、同じ答えが得られます(15)。 floatの場合、log_10(2^24-1)は約7.22ですが、最大精度は6です(http://stackoverflow.com/questions/30688422/is-the-most-significant-decimal-digits-precisionも参照してください)。 - バイナリに変換することができます。) –
あなたは可能性も「測定」、それを:
for(double d = 1 ; d > 0 ; d/=2) System.out.println(d);
このコードのアイデアは、1つのビットと最小の数に到達することです。だから1
(1ビットのみ)から始まり、最後のビットに達するまで2で割る(2進で右に向かってビットをシフトする)。このループによって印刷最後の番号である:
4.9E-324
実行し、このコード、それは
public class FindPrecisionDouble {
static public void main(String[] args) {
double x = 1.0;
double y = 0.5;
double epsilon = 0;
int nb_iter = 0;
while ((nb_iter < 1000) && (x != y)) {
System.out.println(x-y);
epsilon = Math.abs(x-y);
y = (x + y) * 0.5;
}
final double prec_decimal = - Math.log(epsilon)/Math.log(10.0);
final double prec_binary = - Math.log(epsilon)/Math.log(2.0);
System.out.print("On this machine, for the 'double' type, ");
System.out.print("epsilon = ");
System.out.println(epsilon);
System.out.print("The decimal precision is ");
System.out.print(prec_decimal);
System.out.println(" digits");
System.out.print("The binary precision is ");
System.out.print(prec_binary);
System.out.println(" bits");
}
}
変数y
が1.0
異なる最小値となる停止場所を確認します。私のコンピュータ(Mac Intel Core i5)では、それは1.1102...E-16
で止まります。次に、精度(10進数と2進数)を出力します。
https://en.wikipedia.org/wiki/Machine_epsilonに記載されているように、浮動小数点精度はイプシロン値で推定できます。 "1に追加すると、1とは異なる結果をもたらす最小の数字です(1 + eではなく1-eですが、ロジックは同じですが、ロジックは同じです)。
I ' 10進数で説明してください:4桁の精度がある場合、1.0000 - 0.0001を表すことができますが、1.00000-0.00001という数字を表すことはできません(5番目の小数点がありません)。この例では、4桁の精度で、イプシロンは0.0001です。イプシロンは浮動小数点精度を直接測定します。バイナリに変換するだけです。
あなたの質問は「決定する方法」を尋ねました。あなたが探していた答えは、(あなたが受け入れた答えを使って)精度を判断する方法よりも、説明が多くなりました。とにかく、他の人にとっては、マシン上でこのコードを実行することで、 "double"型の精度が決まります。
double
の最大精度は0より大きい最初の値です.DoubleのJavadocによると、この数値はDouble.MIN_VALUE
で表されます。
BigDecimal doubleMinVal = BigDecimal.valueOf(Double.MIN_VALUE);
System.out.println(doubleMinVal.toPlainString());
System.out.println(doubleMinVal.toString());
は、例えばthis IDEOne programを参照してください:あなたは、出力が次のようにすることができます。
[重複した質問のリンク先のwiki](https://en.wikipedia.org/wiki/Double-precision_floating-point_format)を見ましたか? JavaはIEEE 754浮動小数点倍精度を使用します。 –