どちらも数学的な値ですが、浮動小数点数はより正確です。これがエラーの唯一の理由ですか?精度の違いですか?または、別の潜在的な(そしてさらに深刻な)問題がありますか?floatとintを比較すると、Splint(Cコードチェッカー)でエラーが発生するのはなぜですか?
3
A
答えて
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. BigDecimalとintをJavaで比較する
- 2. 比較floatとdouble
- 3. シェルスクリプトの文字列を比較すると "Unexpected operator"エラーが発生する
- 4. 2つのデータテーブルを比較するとSystem.InvalidCastExceptionが発生する
- 5. クラスとintを比較する
- 6. このC#コードでエラーが発生するのはなぜですか?
- 7. C++のintとlongの比較
- 8. sizeof(int)がsizeof(int *)と異なるのはなぜですか?
- 9. intをODataのstringにキャストするとエラーが発生する
- 10. Cで再定義エラーが発生するのはなぜですか?
- 11. C#:NullReferenceExceptionでOutOfMemoryExceptionが発生するのはなぜですか?
- 12. このエラーが発生するのはなぜですか?
- 13. WCFエラーが発生するのはなぜですか?
- 14. メモリ不足エラーが発生するのはなぜですか?
- 15. 「(502)Bad Gateway」エラーが発生するのはなぜですか?
- 16. XMLコードを比較するときにJavaコードで例外が発生する
- 17. C#シンプルなイベントの発生 - 「送信者」とカスタムEventArgsの比較
- 18. __int16とint(32)がC++で異なるasmを生成するのはなぜですか?
- 19. なぜbash + awkスクリプトでエラーが発生するのですか?
- 20. C++奇妙なエラー "intから 'int(__cdecl *)(float、float)への変換なし" "
- 21. floockとSpock(Groovy testing framework)との比較にcloseTo matcherを使用するとエラーが発生する
- 22. AndroidでDisplayMetricsを使用しようとするとエラーが発生するのはなぜですか?
- 23. SwiftでJSONをシリアル化しようとするとエラーが発生するのはなぜですか?
- 24. なぜエラーが発生するのですか? "値エラー" - int()の基数10の無効なリテラル: 'matthew'
- 25. なぜ私は2つのIDをCで比較するのですか
- 26. doubleをjavaのintと比較するのは有効ですか?
- 27. タスクスケジューラでCプログラムを実行するとエラーが発生する
- 28. ポインタでCプログラムをコンパイルするとエラーが発生する
- 29. C++でexternを使用するとエラーが発生する
- 30. このポインタと整数の比較がセグメンテーションフォルトを生成するのはなぜですか?
警告:関数double_equalsには、「通常の」等価性の重要な特性がありません。推移的ではありません。 (通常の等号で、x == y、y == zの場合はx == zです。double_equalsを使用する場合、これは当てはまりません)。 – bortzmeyer