【问题标题】:fabs(-1.#IND000000000000) return -1.#IND000000000000?晶圆厂(-1.#IND000000000000)返回-1.#IND000000000000?
【发布时间】: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


【解决方案1】:

在互联网上进行了更多搜索后,我得到了以下结论:

IEEE-754定义的NAN,高位可以有符号也可以无符号。它没有定义-NAN。

Microsoft 定义了 NAN 和 -NAN。

通过cppreference.com,fabs函数:如果参数为NaN,则返回NaN。

根据 MSDN,fabs 返回其参数的绝对值。没有错误返回。但是当输入为 ±QNAN 或 IND 时,Matherr Exception 设置为 _DOMAIN。

谢谢大家,@QPaysTaxes、@Sneftel、@Cubbi。

发表评论并投反对票然后删除评论的人,你的行为就像把任何你不理解的东西当作坏事,把自己当作无所不知。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2018-08-10
    • 2015-03-04
    • 2013-10-27
    相关资源
    最近更新 更多