编辑:要重现它,请使用这段代码。
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中的一个错误?
答案 0 :(得分:0)
经过互联网搜索后,我得出了以下结论:
IEEE-754定义了NAN,高位可以是有符号或无符号的。它没有定义-NAN。
Microsoft定义了NAN和-NAN。
通过cppreference.com,fabs函数:如果参数是NaN,则返回NaN。
通过MSDN,fabs返回其参数的绝对值。没有错误返回。但是当输入为±QNAN或IND时,Matherr Exception设置为_DOMAIN。
谢谢大家,@ QPaysTaxes,@ Sneftel,@ Cosbi。
发表评论并发表评论然后删除评论的人,你的行为就像对待任何你不理解的事情一样糟糕,并将自己视为知识渊博。