2017-10-26 9 views
4

現在、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であり、有効な値でなければなりません。

興味深いことに、出力は次のとおりです。

  • なぜisinfstd::isinf異なっを振る舞う:

    num = -4.77987e+986 
    isinf(num) = 1 
    std::isinf(num) = 0 
    

    これは私に不思議になりますか?そして、どちらが信頼されるべきですか?

  • Here C99ではisinfがマクロであり、C++ 11ではそれが関数になっています。しかし、私は例をコンパイルするとき。 -std=c++98で、私はまだ同じ動作をします。その場合にはstd::isinfも定義されていないはずですか?
  • 一般に、私のコンパイラ/アーキテクチャが使用する浮動小数点形式はどのようにして知ることができますか?
+2

どのコンパイラバージョンを使用していますか? gcc 6を使用してエラーが発生します。20、OS Xのclangは 'isinf(num)= 0'を返します。 –

答えて

6

isinf、C言語との互換性のために意図cmathから関数は、doubleをとります。 long double引数は、その関数に渡されると暗黙的にdoubleに変換されます。 doubleへの変換は、浮動小数点丸め規則(​​よりわずかに大きい制限自体より大きい任意の数は+infに丸められます)に従って、+infを生成します。

対照的に、std::isinfoverloadedであり、long doubleをとることができます。 long doubleを渡すと、引数は変換されず、std::isinfはそれが無限ではないことを伝えることができます。あなたの他の質問に答えることをしようとする


  • それはisinfは、マクロまたは関数であるかどうかの小さなディテールです。それがマクロであることが分かっているのは、#undefにしたいプログラマにとって便利なことです。それが関数であるかマクロであることが保証されているかは同じですが、その引数はdoubleに変換されます。 float.h/cfloatから

  • ​​とLDBL_MAX IEEE 754倍精度(64ビット形式)または拡張80ビット形式を区別するのに十分に示すものです。広範なプロセッサがそれを実装している20年後にあなたのコードが4倍精度を認識することを確実にしたい場合は、DBL_MANT_DIGLDBL_MANT_DIGなどの追加のマクロを参照することもできます(2017ではそうではありません)。 sizeof(long double)を参照することはお勧めできません。これは、コンパイラがどれくらいの量を埋め込むかに応じて、80ビットの浮動小数点形式の場合は10,12,16となり、16の場合は4倍精度を示す可能性があるからです。

+0

C++の場合、[std :: numeric_limits](http://en.cppreference.com/w/cpp/types/numeric_limits)は通常Cマクロよりも優先され、表示される可能性のある他の浮動小数点型にも拡張可能です。 – rici

+0

"isinf'、...はダブルをとります"というメッセージは不明です。少なくともC言語では 'int isinf(real-floating x)'です。これは、「意味的型よりも広い形式で表現された引数は、その意味型に変換されます」という意味の_型の意味で結ばれているのでしょうか? C11 7.12.3.3 2 – chux

+0

@Bob__申し訳ありませんが、あなたは私の答えの下で質問に関するあなたのコメントを誤って投稿したようです –

関連する問題