重複の可能性:
float および double 比較の最も効果的な方法
私のプログラムでは、いくつかの double 変数が形式の値を取ります1.00000001
。これらの変数の等値チェックは1
明らかに失敗します。
整数との等価性が機能するように、c の double 型変数の精度を下げる方法を知りたかったのです。
重複の可能性:
float および double 比較の最も効果的な方法
私のプログラムでは、いくつかの double 変数が形式の値を取ります1.00000001
。これらの変数の等値チェックは1
明らかに失敗します。
整数との等価性が機能するように、c の double 型変数の精度を下げる方法を知りたかったのです。
浮動小数点値が正確に等しいかどうかをチェックする必要はほとんどありません。特に、交換から来る場合は特にそうです。比較値との差の絶対値が特定のイプシロン未満であることを確認する必要があります。double の「精度」は内部数値表現によって与えられ、変更することはできません。イプシロンを正確に選択する方法は難しい場合があります。その回答には、それについて説明しているコメントがあります。それを読んでください。
ポータブルな方法はありません。
GNU C ライブラリでは、この APIを使用して丸めモードを変更できます。
ただし、一般的には、コードで表現することをお勧めします。これにより、期待が明確になり、移植可能になります。
#define EQUALITY_EPSILON 1e-3 /* Or whatever. */
if(fabs(x - y) <= EQUALITY_EPSILON)
{
}
浮動小数点比較での等値チェックは避けるべきです。epsilon
代わりに、次のように精度値を使用します。
if (fabs(a - b) < epsilon)
{
// treat a and b as equal
}
イプシロンの選択はおそらく複雑ですが、私の知識はそこまで行きません。
「すべてのプログラマーが浮動小数点演算について知っておくべきこと」を Google で検索してください。これらすべてをカバーする有名な記事です。
「double型変数の精度を下げる」というのはあまり意味がありません。おそらくceil
、 、floor
、などの関数を使用する代わりにround
、適切に制御できる方法で double から整数を作成し、その整数を比較に使用することを検討する必要があります。
C99で
#include <stdio.h>
#include <math.h>
int main(){
double d = 1.00000001;
int i = (int)round(d);
printf("%d\n", i);
return 0;
}