1. ホーム
  2. c++

[解決済み] floatを別の変数にコピーすると、両者は等しくなるのでしょうか?

2022-04-24 12:39:56

質問

を使用することは知っています。 == を使用して浮動小数点型変数の等質性をチェックするのは良い方法とは言えません。ただ、次のような記述でそれを知りたいのです。

float x = ...

float y = x;

assert(y == x)

以降 y からコピーされます。 x というアサーションは真になるのでしょうか?

どのように解決するのですか?

また assert(NaN==NaN); kmdreko さんの指摘するような場合、x87-math では、80bit の浮動小数点が一時的にメモリに格納され、後でレジスタに格納されている値と比較されるような状況がありえます。

最小限の例として、gcc9.2 のコンパイル時に -O2 -m32 :

#include <cassert>

int main(int argc, char**){
    float x = 1.f/(argc+2);
    volatile float y = x;
    assert(x==y);
}

ゴッドボルト・デモ https://godbolt.org/z/X-Xt4R

volatile を持たせるのに十分なレジスタープレッシャーをかけることができれば、おそらく省略可能でしょう。 y を保存し、メモリから再ロードします(ただし、コンパイラを十分に混乱させ、比較を完全に省略することはできません)。

GCC FAQリファレンスを参照してください。