4

私はArduino用の完全なdoubleからfloat関数を書いています(無関係ですが、「適切な」ものは見つかりませんでした)。次のチェックを行います。

if (d < 0) {
    d *= -1;
    bin += "-";
}

浮動小数点の不正確さのために、二重の等価性が厄介であることを私は知っています。それで、それをするのは安全ですか?または、これに固執する必要があります(とにかくコードの後半で使用します)

int compareNums(double x, double y) {
    if (abs(x - y) <= EPSILON) {
        return 0;
    } else if (x > y) {
        return 1;
    } else {
        return -1;
    }
}

d < 0いくつか簡単な質問がありd < 0.0ます。

double d小数部分がなくなるまでa に 10 を掛けるので、 と同様のチェックを行いd == (int) dます。使用するのに適したイプシロンは何か疑問に思っています (ここでこれを使用しましたhttp://msdn.microsoft.com/en-us/library/6x7575x3(v=vs.80).aspx )。無限ループで終わる。記事によると、0.000000119209フロートなどの識別可能な最小の違いです。

ありがとう

4

2 に答える 2

2

d < 0は有効です(ただし、書きたいと思いますd < 0.0。最初のケースでは、比較の前にゼロが2倍に「昇格」されます。

<また、ダブルとゼロをまたはで比較すること>は完全に有効であり、「イプシロン」を必要としません。

bin += "-";無意味です。

一般に、float /doublesを"=="と比較することは無効であり、絶対に行わないでください(ゼロや無限大のチェックなどの特殊な場合を除く)。一部の言語では、float間の「==」(または同等のもの)も許可されていません。

d == (int) dもっとナンセンスです。

于 2012-07-18T03:45:59.930 に答える
1

この質問に対する私の答えを参照してください:

浮動小数点値を比較することはどれほど危険ですか?

具体的には、絶対イプシロンを使用してはならず、浮動小数点演算についてすべてのコンピューター科学者が知っておくべきことを完全に読んで理解するまでは、浮動小数点を使用してはならないという推奨事項です。

あなたの質問のこの特定のコードについては、あなたの目標が数字のテキスト表現を印刷することであると思われる場合、単にテスト< 0が正しいです。0そして、あなたが書くかどうかは関係ありません0.0

于 2012-07-18T03:45:11.477 に答える