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

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

我相信1。INF00表示正无穷大,那 -1呢。# IND00和 -1。内心?我有时也看到这个值: 1。$NaN,它不是一个数字,但是是什么导致了这些奇怪的值,它们如何帮助我进行调试?

我使用的是 MinGW,我相信它对浮点数使用的是 IEEE 754表示法。

有人能列出所有这些无效值及其含义吗?

119084 次浏览

来自 C + + 中的 IEEE 浮点异常:

本页将回答以下问题。

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

这些问题与浮点异常有关。如果你得到一些奇怪的非数值输出,你期望一个数字,你要么已经超过了浮点数算术的有限限制,或者你已经要求一些结果是未定义的。为了简单起见,我将坚持使用双浮点类型。类似的备注也适用于浮点类型。

调试1。 # IND,1。 # INF,nan,and inf

如果您的操作生成的正数大于存储在 double 中的正数,则该操作将返回1。# Windows 上的 INF 或 Linux 上的 INF。类似地,您的代码将返回 -1。# INF 或-inf,如果结果是一个太大的负数,不能存储在一个双精度数中。把一个正数除以零得到一个正的无穷大,把一个负数除以零得到一个负的无穷大。本页末尾的示例代码将演示一些产生无穷大的操作。

有些运算在数学上没有意义,比如取一个负数的平方根。(是的,这个操作在复数上下文中是有意义的,但是 double 表示一个实数,因此没有 double 来表示结果。)负数的对数也是如此。Sqrt (- 1.0)和 log (- 1.0)都会返回一个 NaN,这是“数字”的通用术语,指的是“非数字”。Windows 将 NaN 显示为 -1。# IND (“ IND”表示“不确定”)而 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 值的变量,您将得到以下错误:

对于 Decimal,值要么太大,要么太小。

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

至于调试(你的第二个问题) ,在开发你想检查特殊输入值的库时,你可能会发现下面的函数在 Windows C + + 中很有用:

_ isnan ()、 _ islimited ()和 _ fpclass ()

在 Linux/Unix 上,您应该会发现 isnan ()、 islimited ()、 isNormal ()、 isinf ()、 fpclass()非常有用(您可能需要使用编译器标志 lm 来链接 libm)。

对于那些想知道 -1.#IND00-1.#IND之间区别的人(这个问题特别提出,但是没有一个答案提到) :

-1.#IND00

这特指非零数除以零,例如 3.14 / 0(来源)

-1.#IND (NaN的同义词)

这意味着以下四点之一(参见 来源中的 维基百科) :

1)负数的 sqrtlog

2)两个变量都为0或无穷大的操作,例如 0 / 0

3)至少有一个变量已经是 NaN的操作,例如 NaN * 5

4)超出范围的三角法,例如 arcsin(2)