どちらも数学的な値ですが、float の方が精度が高くなります。それがエラーの唯一の理由ですか - 精度の違いですか? それとも、別の潜在的な (そしてより深刻な) 問題がありますか?
6 に答える
これは、整数値のセットが「int」および「float」型の浮動小数点値のセットと等しくないためです。たとえば、float 値 0.5 は整数セットに等しくなく、整数値 4519245367 は float が格納できる値のセットに存在しない可能性があります。そのため、チェッカーは、プログラマーがチェックする問題としてこれにフラグを立てます。
おそらくあまり良い考えではないからです。すべての float を int に切り詰めることができるわけではありません。すべての int を float に変換できるわけではありません。
比較を行うと、整数値は浮動小数点値に「プロモート」されます。その時点で、2つの浮動小数点数の間で正確な等式比較を行っていますが、これはほとんどの場合悪いことです。
通常、ある種の「イプシロンボール」、つまり許容値の範囲が必要です。2つの値が互いに十分に近く、等しいと見なされる場合は、比較を行います。大まかに次のような関数が必要です。
int double_equals(double a, double b, double epsilon)
{
return ( a > ( b - epsilon ) && a < ( b + epsilon ) );
}
アプリケーションにイプシロンの明確な選択肢がない場合は、DBL_EPSILONを使用してください。
符号付き整数とIEEE浮動小数点形式を想定すると、表現できる整数の大きさは次のとおりです。
short -> 15 bits
float -> 23 bits
long -> 31 bits
double -> 52 bits
したがって、afloat
はanyを表すことができshort
、aはanyをdouble
表すことができますlong
。
float は正確な int 値を格納できないため、int i と float f の 2 つの変数がある場合、「i = f;」を割り当てても、「if (i == f)」という比較はおそらく行われません。 true を返します。
これを回避する必要がある場合(正当な理由があり、他の回答で言及されている問題が問題にならないことに満足している場合)、あるタイプから別のタイプにキャストするだけです。