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

时间:2008-12-07 19:00:05

标签: c++ c

我正在使用浮点数搞乱一些C代码,我得到1.#INF00,-1。#IND00和-1。#IND当我尝试在屏幕上打印浮点数时。这些价值意味着什么?

我相信1.#INF00表示正无穷大,但是-1。#IND00和-1。#IND?我有时也会看到这个值:1。$ NaN不是数字,但是导致这些奇怪值的原因是什么?这些可以帮助我进行调试?

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

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

4 个答案:

答案 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)

对于任何想知道-1.#IND00-1.#IND之间的区别的人(问题专门提出了这个问题,答案都没有解决):

-1.#IND00

这专门表示一个非零数字除以零,例如3.14 / 0source

-1.#IND NaN的同义词)

这意味着四件事之一(请参阅wiki中的source):

1)sqrtlog为负数

2)两个变量均为0或无穷大的运算,例如0 / 0

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

4)超出范围触发,例如arcsin(2)