我在用 Floats 编写一些 C 代码,我得到了1。# INF00,-1.# IND00和 -1。当我尝试打印浮动在屏幕上。这些数值是什么意思?
我相信1。INF00表示正无穷大,那 -1呢。# IND00和 -1。内心?我有时也看到这个值: 1。$NaN,它不是一个数字,但是是什么导致了这些奇怪的值,它们如何帮助我进行调试?
我使用的是 MinGW,我相信它对浮点数使用的是 IEEE 754表示法。
有人能列出所有这些无效值及其含义吗?
来自 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 查查非法活动。也许你只是有个窃听器。如果它更微妙,你有一些难以计算的东西,请参阅避免溢出、下溢和精度损失。本文提供了一些技巧,用于计算直接计算时中间步骤溢出的结果。
本页将回答以下问题。
这些问题与浮点异常有关。如果你得到一些奇怪的非数值输出,你期望一个数字,你要么已经超过了浮点数算术的有限限制,或者你已经要求一些结果是未定义的。为了简单起见,我将坚持使用双浮点类型。类似的备注也适用于浮点类型。
调试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
-1.#IND
这特指非零数除以零,例如 3.14 / 0(来源)
3.14 / 0
-1.#IND (NaN的同义词)
NaN
这意味着以下四点之一(参见 来源中的 维基百科) :
1)负数的 sqrt或 log
sqrt
log
2)两个变量都为0或无穷大的操作,例如 0 / 0
0 / 0
3)至少有一个变量已经是 NaN的操作,例如 NaN * 5
NaN * 5
4)超出范围的三角法,例如 arcsin(2)
arcsin(2)