2015-09-23 10 views
10

を使用してを計算すると、無限のfloat表現を使用し、Visual C++ 2013を使用してx64バイナリを構築するときに-infinityが返されます。 Win32ビルドの場合は0が返され、doubleの場合はstd::expのバージョンが返されます。浮動小数点負の無限大は、Visual C++ 2013でx64ビルドの負の無限大を返します。

x64として構築された次のコードは、この問題を示しています。 (Visual Studioのから取られた)コンパイルのための

#include <limits> 
#include <iostream> 

int main(const int argc, const char** argv) { 
    std::cout << "exp of float -infinity: " << std::exp(-std::numeric_limits<float>::infinity()) << std::endl; 
    std::cout << "exp of double -infinity: " << std::exp(-std::numeric_limits<double>::infinity()) << std::endl; 
} 

コマンドラインオプション:

/GS /Wall /Gy /Zc:wchar_t /Zi /Gm- /Od /sdl /Fd"x64\Release\vc120.pdb" /fp:precise /D "_MBCS" /errorReport:prompt /WX /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\NumericLimitsTest.pch" 

上記の出力:

exp of float -infinity: -1.#INF 
exp of double -infinity: 0 

これはなぜ起こるのでしょうか?

+2

これはバグです。 Visual C++ 2015ランタイムライブラリで修正されています。 –

+0

@JamesMcNellis - これは決定的な答えではありませんか? –

答えて

8

私は通常、それはいくつかの説明のバグだったと言うでしょう、cmath機能性とC99のためのC99のC++ 11延期するので、明らかF.9.3.1exp(−∞) returns +0ことに述べています。ただし、

__STDC_IEC_559__を定義する実装は、この附属書の仕様に準拠しなければなりません。

それはおそらくないバグだとあなたは運が悪いかもしれので、マクロはMSVCでの32ビットまたは64ビットモードのいずれかで定義されて表示されていないこと。浮動小数点モードを/fp:strict/fp:preciseの間で変更しても、それ以上の効果はありません。

すべての場合、結果は32ビットと64ビットのターゲットの間で異なります。expと表示されている標準に基づいて、compute the base-e exponential of xはどのように見えるかは一見必要ありません。


あなたはクイックフィックス後にしている場合は、pow機能を使用すると、正しい結果を生成するようだ:

#define DBL_E 2.71828182845904523536 
#define FLT_E 2.71828182845904523536f 
std::cout 
    << "exp of float -infinity: " 
    << std::pow(FLT_E, -std::numeric_limits<float>::infinity()) 
    << std::endl; 
std::cout 
    << "exp of double -infinity: " 
    << std::pow(DBL_E,-std::numeric_limits<double>::infinity()) 
    << std::endl; 

これは関係なく、あなたが64-bit/32-bitdebug/releaseまたはfp:precise/fp:strictを持っているかどうかの両方の行のためのゼロを生成し、しかし、それが保証されているかどうか、私は言うことができませんでした。

+1

Annex F全体がオプションではありませんか? – hvd

+0

@hvdは、MSVCが '_ _STDC_IEC_559_ _'を定義するかどうかによって異なります。私はそれがローカルにインストールされていないので、チェックできません。私は答えを更新します。 – paxdiablo

+0

score ++これは確かに厳密で正確な問題かもしれません。 – imallett

関連する問題