2008-09-01 13 views

答えて

8

これは、整数値のセットが 'int'型と 'float'型のfloat値のセットと等しくないためです。たとえば、浮動小数点値0.5は整数セットに等価がなく、整数値4519245367は浮動小数点が格納できる値のセットに存在しない可能性があります。したがって、チェッカーはこれをプログラマがチェックする問題としてフラグを立てます。

3

これはおそらくあまり良い考えではないためです。すべての浮動小数点数を整数に切り捨てることはできません。すべての整数が浮動小数点に変換されるわけではありません。

1

floatは正確なint値を格納できないので、int iとfloat fの2つの変数がある場合、 "i = f;"を代入しても "if(i == f)"おそらく真実を返さないでしょう。

0

これを回避する必要がある場合(正当な理由があり、他の回答に記載されている問題のどれも問題がないことが幸せです)、あるタイプから別のタイプにキャストするだけです。符号付き整数とIEEE浮動小数点形式を仮定

1

、表すことができる整数の大きさは、次のとおり

short -> 15 bits 
float -> 23 bits 
long -> 31 bits 
double -> 52 bits 
float

したがって、任意shortを表すことができるとdouble任意longを表すことができます。

2

比較を行うとき、整数値は浮動小数点値に「昇格」されます。その時点で、2つの浮動小数点数を正確に比較していますが、これはほとんど常に悪いことです。

一般に、ある種の「イプシロンボール」、または許容可能な値の範囲があり、2つの血管が互いに十分に近く、等しいとみなされる場合は比較を行います。アプリケーションはイプシロンの明白な選択を持っていない場合は

int double_equals(double a, double b, double epsilon) 
{ 
    return (a > (b - epsilon) && a < (b + epsilon)); 
} 

、その後、DBL_EPSILONを使用する:あなたは、おおよそ次のように関数が必要です。

+1

警告:関数double_equalsには、「通常の」等価性の重要な特性がありません。推移的ではありません。 (通常の等号で、x == y、y == zの場合はx == zです。double_equalsを使用する場合、これは当てはまりません)。 – bortzmeyer

関連する問題