1.#INF00,-1。#IND00和-1。#IND是什么意思?

我用一些C代码使用浮动,我得到1.#INF00,-1。#IND00和-1。#IND当我尝试在屏幕上打印浮动。 这些价值是什么意思?

我相信1.#INF00表示正无穷,但是-1。#IND00和-1。#IND呢? 我也有时看到这个价值:$ NaN这不是一个数字,但什么导致这些奇怪的价值,那些如何帮助我debugging?

我正在使用MinGW ,我相信使用IEEE 754表示浮点数。

有人可以列出所有这些无效值,它们是什么意思?

从C ++的IEEE浮点exception :

本页面将回答以下问题。

  • 我的程序只打印出1.#IND或1.#INF(在Windows上)或者nan或inf(在Linux上)。 发生了什么?
  • 我怎么知道一个数字是真的是一个数字而不是一个NaN或一个无穷大?
  • 我怎样才能在运行时了解更多关于NaN和infinities的细节?
  • 你有任何示例代码来显示这是如何工作的?
  • 我在哪里可以学到更多?

这些问题与浮点exception有关。 如果在预期数字的位置出现一些奇怪的非数字输出,那么您已经超出了浮点运算的有限范围,或者您要求提供一些未定义的结果。 为了简单起见,我将坚持使用双浮点types。 类似的说法适用于浮点types。

debugging1.#IND,1.#INF,nan和inf

如果你的操作会产生一个比double更大的正数,那么操作会返回1.#INF在Windows或者inf上。 同样的,你的代码将返回-1。#INF或者-inf,如果结果是一个负数太大而不能存储在double中。 将正数除以零产生正无穷,将负数除以零产生负无穷。 本页末尾的示例代码将演示一些产生无穷的操作。

有些操作没有math意义,比如取一个负数的平方根。 (是的,这个操作在复数的情况下是有意义的,但是double表示一个实数,所以没有双重表示结果。)对于负数的对数也是如此。 sqrt(-1.0)和log(-1.0)都会返回一个NaN,即“不是数字”的“数字”的通用术语。 Windows显示NaN为-1。#IND(“IND”为“indeterminate”),而Linux显示nan。 其他将返回NaN的操作包括0/0,0 *∞和∞/∞。 有关示例,请参阅下面的示例代码。

总之,如果你得到1.#INF或inf,找零溢出或除法。 如果您获得1.#IND或nan,请查找非法操作。 也许你只是有一个错误。 如果它更微妙,并且您有难以计算的东西,请参阅避免溢出,下溢和精度损失。 那篇文章给出了计算结果的技巧,如果直接计算,结果会有中间步骤溢出。

对于那些在.NET环境中的人来说,以下方法可以方便地过滤非数字(这个例子在VB.NET中,但在C#中可能类似):

 If Double.IsNaN(MyVariableName) Then MyVariableName = 0 ' Or whatever you want to do here to "correct" the situation End If 

如果您尝试使用具有NaN值的variables,则会出现以下错误:

对于十进制值,值不是太大就是太小。

上面已经回答了你的问题“他们是什么”。

就debugging(第二个问题)而言,在开发要检查特殊input值的库中,可能会发现以下在Windows C ++中有用的函数:

_isnan(),_isfinite()和_fpclass()

在Linux / Unix上,你应该findisnan(),isfinite(),isnormal(),isinf(),fpclassify()有用的(你可能需要使用编译器标志-lm与libm链接)。