36

最新のC++標準では、次のマクロに気づきました。

bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, float y);
bool islessequal(float x, float y);
bool islessgreater(float x, float y);
bool isunordered(float x, float y);

これらのマクロはC(7.12.14および7.12.14)のものです。

では、なぜ誰かが演算子の代わりにこれらのマクロを使用するのでしょうか?これらのマクロが実行している特別なこと(のチェックなどinf)はありますか、それとも対応する演算子と同じですか?

C ++の例:

#include <iostream>
#include <cmath>

int main()
{
  float x=0.2;
  float y=0.5;
  std::cout << x << " < " << y << " : " << std::boolalpha << std::islessequal( x, y ) << std::endl;
  std::cout << x << " < " << y << " : " << std::boolalpha << ( x <= y ) << std::endl;
}
4

2 に答える 2

38

関係演算子とは異なり、これらのマクロは実際にはブール値のみを返し、浮動小数点例外を発生させることはありません。

要するに、true/を処理するだけでよく、他にはfalse何もありません。


参照:

Open Group の説明 ( C または C++ 標準ではありませんが、Unix/Linux の世界では非常に関連性が高く、ほとんどの場合標準に似ています):

C++標準:

C ライブラリ [c.math]:

分類/比較関数は、C 標準の 7.12.3 分類マクロおよび 7.12.14 比較マクロで定義されている対応する名前を持つ C マクロと同じように動作します。各関数は、次のように 3 つの浮動小数点型に対してオーバーロードされます [...]

C標準:

7.12.14 比較マクロ

[...] 順序付けられた数値のペアの場合、関係 (小さい、大きい、等しい) のうちの 1 つだけが真です。関係演算子は、引数の値が NaN の場合、「無効な」浮動小数点例外を発生させることがあります。NaN と数値、または 2 つの NaN の場合、順序付けられていない関係だけが true になります。次の節は、関係演算子の静かな (浮動小数点例外を発生させない) バージョンであるマクロと、「無効な」浮動小数点例外を被ることなく NaN を説明する効率的なコードの記述を容易にする他の比較マクロを提供します。この節の構文では、real-floating は、引数が実数浮動小数点型の式であることを示します。

于 2012-08-06T10:18:27.107 に答える
13

isgreateretal。C99からC++11に組み込まれました。xこれらは、シグナル値である場合やyシグナル値である場合に、無効な浮動小数点例外を発生させないように定義されていNaNます。

与えられた理論的根拠は次のとおりです。

このマクロは、関係演算子のクワイエット(非浮動小数点例外発生)バージョンです。無効な浮動小数点例外に悩まされることなく、NaNを説明する効率的なコードの記述を容易にします。

上のマクロの数値NaNはいつもと同じです。値は、すべての関係演算子および新しいマクロの下NaNの値を含む他のすべての値とfalseを比較します。NaN

于 2012-08-06T10:22:01.037 に答える