浮点负无穷大的exp在Visual C+中为x64构建返回负无穷大+;2013 使用代码> STD::EXP计算代码> E^ -无穷大< /Calp>当使用无限的浮点表示,使用Visual C++ 2013建立X64二进制时,返回无限。我希望它返回0,这是Win32 builds的情况,或者是std::exp的版本,它需要双精度

浮点负无穷大的exp在Visual C+中为x64构建返回负无穷大+;2013 使用代码> STD::EXP计算代码> E^ -无穷大< /Calp>当使用无限的浮点表示,使用Visual C++ 2013建立X64二进制时,返回无限。我希望它返回0,这是Win32 builds的情况,或者是std::exp的版本,它需要双精度,c++,visual-c++,C++,Visual C++,以下代码(构建为x64)演示了该问题 #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;

以下代码(构建为x64)演示了该问题

#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;
}
以上各项的产出:

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

为什么会发生这种情况?

我通常会说这是一个描述错误,因为C++11在
cmath
功能上遵从C99,C99在
F.9.3.1
中明确指出
exp(−∞) 返回+0
。但是,请记住,标准的附录中规定:

定义
\uu STDC\u IEC\u 559\uuu
的实施应符合本附录中的规范

在MSVC中,该宏似乎没有在32位或64位模式下定义,因此它可能不是一个bug,您可能运气不佳。在
/fp:strict
/fp:precise
之间更改浮点模式也不会使事情变得更好

在所有情况下,32位和64位目标之间的结果似乎有所不同,根据仅规定
exp
计算x
的基e指数的标准,似乎没有要求如何计算,这似乎是可以的


如果您需要快速修复,使用
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;
——定义DBL\u E 2.71828182845904523536
#定义FLT_E 2.71828182845904523536f
标准::cout

整个附录F不是可选的吗?@hvd,取决于MSVC是否定义了
\uu STDC\u IEC\u 559\uuuu
。我没有在本地安装它,因此无法检查。我将更新答案。评分++这可能确实是一个严格/精确的问题。从cl版本18.00.31010(VS 2013)开始预定义的宏
\uuuuu STD\uiec\u559\uuuuu
未定义。此外,VC++因其C99不合规性而闻名:)这是一个错误;它在Visual C++ 2015运行库中被固定。@ JAMESMCNELIS——这不是确定的答案吗?
#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;