我正在使用浮点数搞乱一些C代码,我得到1.#INF00,-1。#IND00和-1。#IND当我尝试在屏幕上打印浮点数时。这些价值意味着什么?
我相信1.#INF00表示正无穷大,但是-1。#IND00和-1。#IND?我有时也会看到这个值:1。$ NaN不是数字,但是导致这些奇怪值的原因是什么?这些可以帮助我进行调试?
有人可以列出所有这些无效值及其含义吗?
答案 0 :(得分:65)
来自IEEE floating-point exceptions in C++:
此页面将回答以下问题。
- 我的程序只打印出1.#IND或1.#INF(在Windows上)或nan或inf(在Linux上)。发生了什么事?
- 如何判断数字是否真的是数字而不是NaN或无穷大?
- 如何在运行时找到有关NaN和无穷大种类的更多详细信息?
- 您是否有任何示例代码来说明其工作原理?
- 我在哪里可以了解更多信息?
这些问题与浮点异常有关。如果你得到一些奇怪的非数字输出,你期望一个数字,你要么超过浮点运算的有限限制,要么你已经要求一些未定义的结果。为了简单起见,我将坚持使用双浮点类型。类似的评论适用于浮动类型。
调试1.#IND,1。#INF,nan和inf
如果您的操作产生的正数大于可以存储在double中的正数,则操作将在Windows上返回1.#INF或在Linux上返回inf。类似地,如果结果是负数太大而无法存储在double中,则代码将返回-1。#INF或-inf。将正数除以零会产生正无穷大,将负数除以零会产生负无穷大。本页末尾的示例代码将演示一些产生无穷大的操作。
某些操作没有数学意义,例如取负数的平方根。 (是的,这个操作在复数的上下文中是有意义的,但是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,请查找非法操作。也许你只是有一个bug。如果它更精细并且您有一些难以计算的东西,请参阅避免溢出,下溢和精度损失。该文章为计算结果提供了技巧,如果直接计算,则会产生中间步骤溢出。
答案 1 :(得分:3)
对于那些在.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值的变量,您将收到以下错误:
对于十进制,值太大或太小。
答案 2 :(得分:2)
您的问题“它们是什么”已在上面得到解答。
就调试(第二个问题)而言,在开发要检查特殊输入值的库中,您可能会发现以下函数在Windows C ++中很有用:
_isnan(),_ isfinite()和_fpclass()
在Linux / Unix上你应该找到isnan(),isfinite(),isnormal(),isinf(),fpclassify()很有用(你可能需要使用编译器标志-lm来链接libm)。
答案 3 :(得分:2)