为什么这些双精度数的返回值是-1.#IND?

16

我有:

double score = cvMatchContourTrees( CT1, CT2, CV_CONTOUR_TREES_MATCH_I1, 0.0 );
        cout<<score<<endl;

返回值中出现了-1.#IND。除此之外,正常的值如1.34543都是正常的。

为什么会出现这种情况?我该如何解决?


5
#INDNaN的意思。您可能希望阅读此文章(http://www.johndcook.com/IEEE_exceptions_in_cpp.html)了解更多信息。 - Frédéric Hamidi
cvMatchContourTreesе’ҢOpenCVеңЁиҝҷдёӘй—®йўҳдёӯе®Ңе…ЁжҳҜиҜҜеҜјгҖӮ - Lightness Races in Orbit
4
@Tomalak,你怎么确定呢?问题是“-1.#IND的意思是什么?”还是“cvMatchContourTrees如何返回那个值?”请说明。 - Mark Ransom
@Mark:说得好。我想这可能是两者兼备的。 - Lightness Races in Orbit
请参阅:http://blogs.msdn.com/b/oldnewthing/archive/2013/02/21/10395734.aspx 和 http://blogs.msdn.com/b/oldnewthing/archive/2013/02/28/10397976.aspx。 - Michael Burr
3个回答

15

如Frederic所说,这是由Visual Studio在Windows上构建的应用程序格式化了“Not a Number”的结果。John D Cook有一个非常好的参考资料:

Windows将NaN显示为-1.#IND(“IND”代表“不确定”),而Linux则显示nan。

...

简而言之,如果你得到了1.#INF或inf,请查找是否存在溢出或除以零。如果你得到了1.#IND或nan,请查找是否存在非法操作。

如果你对字符串进行任何格式化处理,请注意截断问题;我自己在处理这些错误时遇到过相关问题


我不确定 0/0 是否会产生 NaN。我认为它就像其他除以零一样,你会从操作系统得到一个浮点异常。 - Lightness Races in Orbit
@Tomalak:在Visual Studio中,0/0会抛出异常。0.0/0.0则会返回NaN或抛出异常,你可以通过一个标志来控制它。默认情况下,它返回NaN。 - Johan Råde
@user763305:是的,完全正确。但这并不是原始引用所说的。我的观点是,要小心维基百科的危险... - Lightness Races in Orbit
也许是...或者可能是在库调用中,该库会静默掩盖异常,但仍然像OP的问题一样输出NaN...? - Jon Cage

5
std::cout << (0/0.f);
// Output: -1.#IND

它是 非数字


3

依据我的经验,-1.#IND 的出现来自于虚数。因此,执行 cout << sqrt(-1.); 应该会输出 -1.#IND


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接