を使用してを計算すると、無限の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
これはなぜ起こるのでしょうか?
これはバグです。 Visual C++ 2015ランタイムライブラリで修正されています。 –
@JamesMcNellis - これは決定的な答えではありませんか? –