Double.MIN_VALUEが負でないのはなぜですか


157

誰もがその理由についていくつかの光を当てることができますか Double.MIN_VALUE実際にダブルスが取ることができる最小値ではないを明らかにすることはできますか?これは正の値であり、Doubleはもちろん負の値でもかまいません。

なぜそれが便利な数字なのかは理解できますが、特にと比較すると、非常に直感的でない名前のようInteger.MIN_VALUEです。それDouble.SMALLEST_POSITIVEまたはMIN_INCREMENT類似のものを呼び出すと、より明確なセマンティクスが得られます。

また、ダブルスが取ることができる最小値は何ですか?ですよ-Double.MAX_VALUEね?ドキュメントは言っていないようです。


1
回答ありがとうございます!範囲と精度の違いは理にかなっています。私はまだかなり奇妙で一貫性のない命名を見つけましたが、それは実行可能です。
mo-seph

1
それはwriteBytesをとるメソッドを呼び出したのと同じ天才によって書かれたので、私は推測していますString
Trejkaz 2016年

基本的に、あなたは正しい、それは悪いセマンティクスです
Alvaro

回答:


180

IEEE 754形式では、符号用に1ビットが予約され、残りのビットはマグニチュードを表します。これは、それがorigoについて「対称的」であることを意味します(1つ以上の負の値を持つ整数値とは対照的)。したがって、最小値は単純に最大値と同じになり、符号ビットが変更されるため、はい-Double.MAX_VALUEあなたはAと表すことができる可能な限り最小の実際の数でありますdouble

Double.MAX_VALUEはと見られるべきだと思います最大の大きさ場合、実際に書くだけで意味があります-Double.MAX_VALUE。理由も説明しますDouble.MIN_VALUE、正の値が最小になるます(これは、可能な最小の大きさを表すため)。

しかし、確かに、その命名は少し誤解を招くものであることに同意します。その意味Integer.MIN_VALUEに慣れていてDouble.MIN_VALUE、一番小さいのを読んだときもビックリしましたので、表現できる絶対値値。多分彼らはそれが単に:-) -から離れているので、可能な限り最小の値を表す定数を持つことは不必要であると考えました。MAX_VALUE

(注意もありますDouble.NEGATIVE_INFINITYが、これは無視します。これは「特殊なケース」と見なされ、実際には実際の数を表すものではないためです。)

これは主題についてのよいテキストです。


3
これをありがとう。いくつかの統計分析コードを移植し、Javaを盲目的にC#に変換していました。-infinityまたはNaNでいくつかの数値が出てくることに気づき、アルゴリズムを詳しく調べました。double.MIN_VALUEは文脈上意味がないことに気づき、検索を行いました。この投稿は、Javaドキュメントの前に表示されます。それは本当にdouble.Epsilonが何であるかを混乱させる名前です。大したことではなく、修正に1分もかかりませんでしたが、驚くべきことです。
Ed S.

「表現できる最小の絶対値」は「イプシロン」と名付けられているはずではありませんか?
Dave Cousineau 2017

@Sahuagin、それは本当に何か特別な名前が付けられているとは「想定されていません」。イプシロンは、数学/物理学で一般に任意の小さい正の量を表すギリシャ文字です。SmallestNonzeroFloat64たとえば選択してください。
aioobe 2017

12

これらの定数は、符号とは関係ありません。これは、doubleを3つの部分(Sign、Exponent、およびMantissa)の複合体と見なす場合により意味があります。Double.MIN_VALUEは、実際には、ゼロへのフラッシュが発生する前に指数が最小値にあるときに、仮数が想定できる最小値です。同様に、MAX_VALUEは、無限へのフラッシュが発生する前に指数が最大値にあるときに仮数が想定できる最大値として理解できます。

これら2つのよりわかりやすい名前は、最大の絶対値(詳細にはゼロ以外を追加)と最小の絶対値です。値(値(詳細には非無限を追加)です。

詳細については、IEEE 754(1985)規格を確認してください。改訂された(2008)バージョンがありますが、それはJavaでさえサポートされていないより多くのフォーマットを導入するだけです(厳密に言えば、Javaは他の多くの高水準言語のように、IEEE 754 1985のいくつかの必須機能のサポートを欠いています)。



3

doubleの最小値は、実際にはaの最小値ではないDouble.NEGATIVE_INFINITY理由Double.MIN_VALUEですDouble

doubleは浮動小数点数であるため、最大数(精度が低い)または0に最も近い数(精度が高い)のみを使用できます。

無限ではないdoubleの最小値が本当に必要な場合は、を使用できます-Double.MAX_VALUE


1
その考えに従って、Double Double.MAX_VALUEまたはDouble.POSITIVE_INFINITYの最大値は何ですか?
mo-seph

Double.MIN_VALUEに等しい可能性がありますDouble.NEGATIVE_INFINITY
starblue

@starblue、いいえ。@ mo-seph 、、、Double.POSITIVE_INFINITY+∞>すべておよび-∞<すべて
Colin Hebert

@Colin Hebert、正確には> =および<= ;-)
aioobe

あなたはおそらく私を誤解しました。より良い世界でDouble.MIN_VALUEは、はに等しくなります。これは、整数型Double.NEGATIVE_INFINITYと一致するためMIN_VALUEです。私は最大値を計算するための任意の変数を初期化できMIN_VALUE、それは正しいでしょう。Double.MIN_VALUE私たちが今持っているが、より良い名前を持っているでしょう。(同様にMAX_VALUE。)
starblue

2

浮動小数点数の場合、正確な範囲がないため、精度が重要です

/**
 * A constant holding the smallest positive nonzero value of type
 * <code>double</code>, 2<sup>-1074</sup>. It is equal to the
 * hexadecimal floating-point literal
 * <code>0x0.0000000000001P-1022</code> and also equal to
 * <code>Double.longBitsToDouble(0x1L)</code>.
 */

しかし、私はそれがおそらくもっと良い名前になっているはずだと同意します:)


OK、でも、なぜDouble.MAX_VALUEが必要なのですか?それは明確に定義されているようです。
mo-seph

これは、その最大の正確な値(無限ではない)であり、符号を考慮していません。
John Gardner、

0

それはで言うように、文書

Double.MIN_VALUEには、最小保持一定でPOSITIVE( - 1074)double型の非ゼロ値を、2 ^。

ここでの秘訣は、浮動小数点数表現について話していることです。doubleデータ型は、倍精度64ビットIEEE 754浮動小数点です。浮動小数点は、1,000,000,000,000から0.0000000000000001までの数値を簡単に表し、スケールの両端で精度(桁数)を最大化します。(以上参照してくださいこれを

仮数部は、常に正の数、浮動小数点数の有効桁数を保持しています。指数は、仮数と符号に乗算する基数の正または負の累乗を示します。4つのコンポーネントは次のように組み合わされて浮動小数点値を取得します。

ここに画像の説明を入力してください

MIN_VALUEは、仮数が表すことができる最小値であると考えてください。浮動小数点表現の最小値は、それを使用して表現できる最小の大きさです。(ただし、この混乱を避けるために、より適切な名前を使用することもできます)

123> 10> 1> 0.12> 0.012> 0.0000123> 0.000000001> 0.0000000000000001


以下は参考までです。

倍精度浮動小数点は、2 ^ -1074から2 ^ 1023までの2,098のべき乗を表すことができます。2の非正規化パワーは、2 ^ -1074から2 ^ -1023までです。2の正規化された累乗は、2 ^ -1022〜2 ^ 1023の累乗です。これこれを参照してください。


ありがとうございました!なぜこの回答が反対投票されたのかはわかりません。
結合
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.