为啥这些双精度数的返回值是 -1.#IND?
Posted
技术标签:
【中文标题】为啥这些双精度数的返回值是 -1.#IND?【英文标题】:Why are the return values of these doubles -1.#IND?为什么这些双精度数的返回值是 -1.#IND? 【发布时间】:2011-09-19 19:23:53 【问题描述】:我有:
double score = cvMatchContourTrees( CT1, CT2, CV_CONTOUR_TREES_MATCH_I1, 0.0 );
cout<<score<<endl;
返回值为 -1.#IND。除此之外,正值是正常的,例如 1.34543。
为什么会这样?我该如何解决?
【问题讨论】:
#IND
是 NaN。您可能想阅读this。
cvMatchContourTrees
和 OpenCV 在这个问题上是完全的红鲱鱼。
@Tomalak,你怎么能确定?问题是“-1.#IND 是什么意思?”还是“cvMatchContourTrees 如何返回该值?”
@Mark:公平点。我想可能两者兼而有之。
参见:blogs.msdn.com/b/oldnewthing/archive/2013/02/21/10395734.aspx 和 blogs.msdn.com/b/oldnewthing/archive/2013/02/28/10397976.aspx
【参考方案1】:
正如 Frederic 所说,这是“Not a Number”被 Windows 上使用 Visual Studio 构建的应用程序格式化的结果。 John D Cook 有一个excellent reference:
Windows 将 NaN 显示为 -1.#IND(“IND”表示“indeterminate”),而 Linux 显示 nan。
...
简而言之,如果您得到 1.#INF 或 inf,请查找溢出或除以零。如果得到 1.#IND 或 nan,寻找非法操作。
如果您对字符串进行任何类型的格式化,请注意截断;我自己处理这类错误时遇到过related issues。
【讨论】:
我不确定0/0
是否会产生NaN
。我认为这就像任何其他除以零一样,因为您会从操作系统获得浮点异常。
@Tomalak:使用 Visual Studio,0 / 0 会引发异常。 0.0 / 0.0 要么返回 NaN 要么抛出异常,你可以通过一个标志来控制它。默认是返回 NaN。
@user763305:是的,完全正确。这不是原始报价所说的。我的意思是,小心***的危险......
也许.. ...或者它在库调用中,并且该库默默地掩盖了异常,但仍然根据 OPs 问题吐出 NaN...?【参考方案2】:
std::cout << (0/0.f);
// Output: -1.#IND
我是NaN。
【讨论】:
【参考方案3】:根据我的经验,-1.#IND
来自虚数。所以,做cout << sqrt(-1.);
应该输出-1.#IND
【讨论】:
以上是关于为啥这些双精度数的返回值是 -1.#IND?的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中使用 xstream 转换为 xml 时如何避免大双精度数的科学记数法