0

Double以下のデータ型が(.equals()テスト) またはdouble(テスト)にキャストされた場合、等価テストの精度はどのくらい==ですか?

  • Long
  • long
  • Integer
  • int

Long等価性テストが可能な、longIntegerまたは値の範囲内でのみ正確である場合int、この精度が保持される正確な範囲はどれくらいですか?

例えば;

Long longTest = Long.MAX_VALUE;
Long longTest2 = Long.MAX_VALUE;
double doubleTest = (double) longTest;
double doubleTest2 = (double) longTest2;
if(doubleTest == doubleTest2) //Is this accurate? 
     return true;
4

3 に答える 3

0

次のように考えてください。

double と long の両方が 64 ビットのストレージを占有します。float と int の場合は 32 です。

指数に費やされるビットがあるため、long を double にキャストしたり、int を float にキャストしたりすると、常に精度が失われる危険があります。

唯一の保存は int -> double です。

とにかく、あなたの例に関しては、上記の理由により、double は絶対精度で Long.MAX_VALUE を保持できません。概算になります。ただし、近似は毎回同じである必要があるため、例は true を返す必要があります。

于 2013-10-30T16:03:09.963 に答える
0

いくつかのケース...

両方の型がラッパーである場合、equals は常に正確ですが、equals は型に依存することに注意してください (たとえば、Integer.equals(Long) は値に関係なく常に false になります)。さもないと...

1 つのタイプがラッパーで、もう 1 つのタイプがプリミティブである場合、ラッパーはアンボックス化され、両方のタイプが最初からプリミティブであったのと同じように、== セマンティクスを使用して比較が行われます。

プリミティブ (==) の等価性は、任意の整数型 (byte、short、int、long) に対して正確です。小さい方の型が大きい方の型にキャストされてから比較されます。char の場合、より大きな型にキャストされますが、unsignedです。

一方のオペランドが浮動小数点型 (float、double) であり、もう一方の型が浮動小数点型にキャストされ、その場合、精度が失われる可能性があります。Float は <= 24 ビットの有効ビットを持つ任意の整数値を正確に表すことができ、double は 53 ビットの関連精度を持ちます (型の仮数ビットの数によって決まります。詳細については IEEE754 を参照してください)。

基本的に、float == (int) N は (approx.) abs(N) <= (1 << 23) の場合にのみ正確であり、double = (long) N の場合は abs(N) <= (1 << 52) )。整数型に上位ビットがある場合、型が float/resp にキャストされると最下位ビットが失われます。ダブル。double には int が有効なビットよりも多くの仮数ビットがあるため、double と int の比較はその点で正確です。

于 2013-10-30T17:08:42.037 に答える
0

Java の作成者が==数値型のすべての組み合わせに対してオーバーロードを定義して、同じ数値を持つものだけが等しいとfloat比較されるようにすることは可能でしたが [たとえば、16777217 と等しい値は存在しないことを意味します] ]、またはその演算子が等価関係として動作しない型の組み合わせでの使用を禁止するために==、それらのいずれも行いませんでした。代わりに、意味があるかどうかに関係なく、オペランドをプリミティブ型の任意の組み合わせと比較できるようにする必要があり、そのような比較では、他のコンテキストに存在するのと同じ暗黙の変換を使用する必要があると判断しました (私が本当に嫌いな決定、btw) .

したがって、たとえば alongと aの比較は、変換で精度が失われたかどうかに関係なくfloat、近似変換を実行してそれを比較することによって実行されます。floatと の比較はfloatdoubleに正確な変換を実行してdouble比較することによって行われます。これにより、16777216.0f == 16777217、および 16777217 == 16777217.0 になりますが、167772176.0f != 16777217.0 になります。が他の値float最良の 表現であるかどうかを知りたい場合や、それが正確な表現であるかどうかを知りたい場合がありますが、Java の型ランキングは、演算子がfloatどの質問に答えるかに関して一貫性がありません。==

于 2013-10-30T16:54:21.250 に答える