【发布时间】:2017-06-26 18:27:18
【问题描述】:
编辑:要重现它,请使用这段代码。
union
{
double d;
size_t s;
} d;
d.s = 0xfff8000000000000;
d.d = fabs(d.d);
std::cout << d.d << std::endl;
输出是
-1.#IND
编辑:我不同意这重复了另一个问题,sqrt 和 abs 是绝对不同的功能。当您向 sqrt 发送负值时,它可能会给您 -Nan,但对于 abs,它应该给您 Nan。
我正在使用 VS2013。一个计算函数返回-1.#IND000000000000(十六进制0xfff8000000000000) ,这应该意味着 Visual Studio 中的 -Nan 并且我使用 fabs() 来获取它的 abs 值,它仍然给我 -1.#IND000000000000。我尝试使用 std::abs 并得到相同的结果。
double x = some_function(...); // return -1.#IND000000000000
x = fabs(x);
// or
x = std::abs(x);
在http://en.cppreference.com/w/cpp/numeric/math/fabs 中只提到了 fabs(-INF)=INF,没有提到 NAN 或 IND。这是未定义的行为,还是 Visual Studio 2013 中的错误?
【问题讨论】:
-
-Nan,为什么要投反对票?
-
很抱歉,如果您不清楚,能否等待知道的人回答?
-
没有 -NaN 这样的东西。这与 NaN 相同。当然,除非您启用了
-ffast-math;然后各种各样的东西都被扔掉了。尝试在字面上 Not a Nnumber 的事物上做数学运算不会得到预期的结果。 -
我不确定这个值是怎么来的,它来自外部库方法,在 Visual Studio 调试中它显示为 -1.#IND000000000000。 1.#IND000000000000是Nan,那么那个一定是-Nan。我没有使用 -ffast-math 选项,但不确定库是否启用了它。
-
不,它不是 -NaN。这只是南。有几种表示,其中一些可能碰巧看起来像另一个的否定版本,但它们在 IEEE 标准下都是相同的,并且数学库以相同的方式处理 - 也就是说,不可预测且奇怪。
标签: c++ visual-studio nan