現在、C++で浮動小数点値を扱っています。 考えてみましょうC++スニペット以下:私は、x86マシン上でGCCを使用していますよう浮動小数点形式とisinf()
#include <cmath>
#include <cstring>
#include <iostream>
int main() {
long double num;
// Set num to a large, valid, floating point value
memset(&num, 0xcc, sizeof(num));
std::cout << "num = " << num << std::endl;
std::cout << "isinf(num) = " << isinf(num) << std::endl;
std::cout << "std::isinf(num) = " << std::isinf(num) << std::endl;
return 0;
}
はWikipediaによると、これは、80ビットextended precision浮動小数点値を作成します。したがって、浮動小数点値は0xcccc cccc cccc cccc cccc
であり、有効な値でなければなりません。
興味深いことに、出力は次のとおりです。
- なぜ
isinf
とstd::isinf
異なっを振る舞う:num = -4.77987e+986 isinf(num) = 1 std::isinf(num) = 0
これは私に不思議になりますか?そして、どちらが信頼されるべきですか?
- Here C99ではisinfがマクロであり、C++ 11ではそれが関数になっています。しかし、私は例をコンパイルするとき。
-std=c++98
で、私はまだ同じ動作をします。その場合にはstd::isinf
も定義されていないはずですか? - 一般に、私のコンパイラ/アーキテクチャが使用する浮動小数点形式はどのようにして知ることができますか?
どのコンパイラバージョンを使用していますか? gcc 6を使用してエラーが発生します。20、OS Xのclangは 'isinf(num)= 0'を返します。 –