私はバイナリ意味x0==x1
とy0==y1
、(及び==
有すると仮定すると、次のC式(変数は32ビット浮動小数点数である)浮動小数点ゼロ(IEEE 754不変?)
float result = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
を有します表現のアイデンティティー)では、式が必ずゼロに評価されるという事実に頼ることができますか(浮動小数点のすべてのビットが0に設定されているかのように)?言い換えれば、次の不変量が常に成立すると仮定できますか?
memcmp(&a, &b, sizeof(float) == 0 => memcmp(a-b, (uint32_t)0, sizeof(float)) == 0
0*a == 0.0
すべての値は有限の数値(無限大またはNaN)でないとは限りません。
編集:回答で指摘したように、0での乗算は符号付きゼロを生成できます。私はまだすなわち、式の結果は、FP-比較ルールを使用して0.0に等しいであろうという事実に頼ることができます。:
(result == 0.0)
編集1:置き換えタイプは、より良い質問を説明するために呼び出すmemcmpでキャストします。
P.S.私は互換性のあるC11コンパイラのみに制限しています。私はSTDC_IEC_559サポートに頼っても構わないと思っています。
'y2 - y0'と' x2 - x0'は有限であるとも仮定できますか? –
@OliverCharlesworth:はい。そうでなければ、結果は未定義です。 – MrMobster
どのタイプが 'a'と' b'ですか?それらが 'uint32_t'でない場合、あなたのコードは未定義のビヘイビアを呼び出します(実効型ルールの違反)。だから何でも標準によって許可されています。'ZERO'の場合と同じです。 – Olaf