2017-04-26 5 views
5

max値は、次のとおり友達同士のInt.MaxValueはどうですか?スカラのint、フロートと長いの

Int.MaxValue = 2147483647

Float.MaxValue = 3.4028235E38

Long.MaxValue = 9223372036854775807L

Scalaコンパイラの著者Keynote, PNW Scala 2013、スライド16 What's Int.MaxValue between friends?

val x1: Float = Long.MaxValue 
val x2: Float = Long.MaxValue - Int.MaxValue 
println (x1 == x2) 

// NO WONDER NOTHING WORKS 

なぜこの式はtrueを返しますか?

+0

それは、コンパイルしていますか? 'x2'の後に等号が必要ないのですか? – Carcigenicate

+0

これは再現できません。代わりに構文エラーが発生します。 –

+1

あなたが言及したスライドが見つかりました。投稿したコードは、スライド上のコードとは異なります。スライド上のコードに構文エラーはありません。 –

答えて

10

Floatは、4バイト浮動小数点値です。一方、Longは8バイトの値であり、Intも4バイトの値です。しかし、数値が4バイトの浮動小数点値に格納される方法は、約8桁の精度しか持たないことを意味します。したがって、最下位4バイト(9-10桁)の値にかかわらず、ロングの4つの最上位バイト(約9-10桁)でも格納する能力はありません。

したがって、異なるビットがFloatの解像度より小さいため、2つの式の表現は同じです。Floatしたがって、2つの値は等しいと見なされます。

+3

「浮動小数点演算がうまくいく」と答える衝動を避けた答えを書くために+1を与える我々はすべてが欲しかった。 – ashawley

3

マイク・アレンの答えをエコーし​​ていますが、追加のコンテキストを提供したいと考えています(これは別の回答ではなくコメントとして残していましたが、SOの評判機能ではできません)。 (それは符号なし整数である場合)または

整数は、0から2^nと定義された値の最大範囲を有する-2 ^(N-1)2 ^(n-1)の(符号付き整数の場合)ここでnは基礎となる実装(この場合n = 32)のビット数です。 2^31より大きい数値を符号付きの値で表す場合は、intを使用できません。署名付きロングは、2^63まで動作します。これより大きいものについては、署名付き浮動小数点数は約2^127まで上がることがあります。

その他の注意点は、浮動小数点数に格納された値が最大値に近づいた場合にのみ、これらの解像度の問題が発生することです。この場合、減算演算は、多くのオーダーの値が最初の値よりも小さい真の値の変化を引き起こします。 floatは100と101の差を四捨五入しませんが、10000000000000000000000000000と10000000000000000000000000001の差を四捨五入することがあります。

同じ値が小さい値になります。 0.1を整数にキャストすると、正確に0になります。これは一般的に、整数データ型の失敗とはみなされません。

サイズが大きく、丸め誤差を許容できない数値で操作している場合は、バイナリデータ表現の固有の制限を考慮したデータ構造とアルゴリズムが必要です。 1つの可能な解決策は、より少ないビットの指数関数で浮動小数点符号化を使用することであり、それにより最大値を制限するが、より大きい解像度を提供することは、より重要でないビットである。更に詳細については、チェックアウト:(浮動小数点エンコーディングを定義する)

関連する問題