web-dev-qa-db-ja.com

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

誰がDouble.MIN_VALUEが実際にDoublesが取ることができる最小値ではないのか、いくつかの光を当てることができますか?これは正の値であり、Doubleはもちろん負の値にすることができます。

なぜ便利な数字なのかは理解していますが、特にInteger.MIN_VALUEと比較すると、非常に直感的でない名前のようです。 Double.SMALLEST_POSITIVEまたはMIN_INCREMENTなどと呼ぶと、セマンティクスがより明確になります。

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

147
mo-seph

IEEE 754形式には、符号用に予約された1ビットと、大きさを表す残りのビットがあります。これは、(もう1つの負の値を持つInteger値とは対照的に)origoの周りで「対称」であることを意味します。したがって、最小値は単純に最大値と同じで、符号ビットが変更されているため、yes-Double.MAX_VALUEが可能な限り小さいdoubleで表すことができる実際の番号。

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

しかし、確かに、命名が少し誤解を招くことに同意します。 Integer.MIN_VALUEの意味に慣れていた私は、Double.MIN_VALUEが表現できる最小absolute値だったことを読んだとき、少し驚きました。おそらく-から離れたMAX_VALUEであるため、可能な限り最小の値を表す定数を持つことは不要であると彼らは考えたのでしょう:-)

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

ここ は主題に関する良いテキストです。

161
aioobe

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

これら2つのよりわかりやすい名前は 最大の絶対 (冗長性にゼロ以外を追加)および 最小絶対 値(冗長性に非無限大を追加)。

詳細については、 IEEE 754(1985) 規格をご覧ください。改訂版(2008)がありますが、Java(厳密にはJavaでもサポートされていないIEEE 754 1985の一部の必須機能のサポートさえない、より多くの形式のみが導入されています。 、他の多くの高レベル言語のように)。

10
Durandal

紛らわしい名前は Cにまでさかのぼる であり、これは FLT_MIN を最小の正数として定義できると仮定しています。

-Double.MAX_VALUEを使用する必要があるJavaのように、Cで最小の浮動小数点数を取得するには -FLT_MAX を使用する必要があります。

4
Philipp Claßen

Doubleの最小値はDouble.NEGATIVE_INFINITYであるため、Double.MIN_VALUEDoubleの最小値ではありません。

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

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

2
Colin Hebert

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

/**
 * 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>.
 */

しかし、私はそれがおそらくより良い名前を付けられるべきだったことに同意します:)

2
John Gardner