-3

私がこのようなものを持っている場合:

double a = 1.0f;
double b = 1.0f;
double c = 1.0f;
double d = 1.0f;

a /= 3.0f;    // 0.3333...
b /= 3.0f;
c /= 3.0f;

if ((a+b+c) == 1)
    puts("sum equals 1");
if (3*a == 1)
    puts("product equals 1");
if (d == 1)
    puts("d equals 1");

当然のことながら、3番目のものだけが実行されます。いくつかの独立変数の合計が正確に1に等しい場合、コードを実行する簡単な方法はありますか?

編集:私は(1 / 3.0)+(1 / 3.0)+(1 / 3.0)が1ではない理由を本当に知っています。しかし、私はそれを尋ねる別の方法を知りませんでした。

4

1 に答える 1

0

a + b+cとa+b + c-1を印刷して、結果を比較してみてください。a + b + c-1の結果が正確に0ではないことに気付くでしょう。浮動小数点演算は無限の精度を提供しないため、これは常に問題です。

考えられる解決策の1つは、abs(a + b + c-1)がしきい値よりも小さいかどうかをテストすることです。別の解決策は、浮動小数点のない実装に切り替えることです。たとえば、分子、分子を使用した表現です。別の解決策は、間隔演算を実装し、結果にゼロが含まれているかどうかを確認することです。

あなたの場合の最良の解決策は、あなたが実際に達成しようとしていることによって異なります。

于 2013-02-16T07:53:35.930 に答える