晶圆厂(-1.#IND000000000000)return -1.#IND000000000000?
fabs(-1.#IND000000000000) return -1.#IND000000000000?
编辑:要重现它,请使用这段代码。
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。一个计算函数return-1.#IND000000000000 (hex 0xfff8000000000000)
,这应该意味着 Visual studio 中的 -Nan 并且我使用 fabs() 来获取它的绝对值,它仍然给我 -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 中的错误?
在网上搜索了一番之后,我得到了这样的结论:
IEEE-754定义的NAN,高位可以有符号也可以无符号。它没有定义-NAN。
Microsoft 定义了 NAN 和 -NAN。
通过cppreference.com,fabs函数:如果参数是NaN,NaN是returned。
通过 MSDN,fabs returns 其参数的绝对值。没有错误return。但是当输入为±QNAN或IND时,Matherr Exception设置为_DOMAIN.
谢谢大家,@QPaysTaxes、@Sneftel、@Cubbi。
那个 post 发表评论并投反对票然后删除评论的人,你的行为就像把任何你不理解的东西都当作坏事,把自己当作 know-all。
编辑:要重现它,请使用这段代码。
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。一个计算函数return-1.#IND000000000000 (hex 0xfff8000000000000) ,这应该意味着 Visual studio 中的 -Nan 并且我使用 fabs() 来获取它的绝对值,它仍然给我 -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 中的错误?
在网上搜索了一番之后,我得到了这样的结论:
IEEE-754定义的NAN,高位可以有符号也可以无符号。它没有定义-NAN。
Microsoft 定义了 NAN 和 -NAN。
通过cppreference.com,fabs函数:如果参数是NaN,NaN是returned。
通过 MSDN,fabs returns 其参数的绝对值。没有错误return。但是当输入为±QNAN或IND时,Matherr Exception设置为_DOMAIN.
谢谢大家,@QPaysTaxes、@Sneftel、@Cubbi。
那个 post 发表评论并投反对票然后删除评论的人,你的行为就像把任何你不理解的东西都当作坏事,把自己当作 know-all。