为啥这些双精度数的返回值是 -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 &lt;&lt; sqrt(-1.); 应该输出-1.#IND

【讨论】:

以上是关于为啥这些双精度数的返回值是 -1.#IND?的主要内容,如果未能解决你的问题,请参考以下文章

C#将数字四舍五入为双精度数的任意数字[重复]

在 Java 中使用 xstream 转换为 xml 时如何避免大双精度数的科学记数法

C语言,求高手分析双精度的输入,为啥定义一个双精度,输入函数中少了一个l,只用%f,可以执行,结果错误

为啥我不能在 Swift 的双精度元组上使用 min()?

为啥中位数跳闸 data.table (整数与双精度)?

为啥 C/RUST 中的一个加法计算在结果 ASM 中有 3 个双精度浮点加法工具?