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

Hof*_*ann 63 c c++

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

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

我正在使用MinGW,我认为它使用IEEE 754表示浮点数.

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

mat*_*mat 66

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

本页面将回答以下问题.

  • 我的程序只打印出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.如果它更精细并且您有一些难以计算的东西,请参阅避免溢出,下溢和精度损失.该文章为计算结果提供了技巧,如果直接计算,则会产生中间步骤溢出.

  • @tenpn实际上在C++中,+ infinity == + infinity.尝试检查1.0/0.0:`1.#INF00` ==`1.#INF00`返回true,`-1.#INF00` ==`-1.#INF00`返回true,但是`1.#INF00` = =`-1.#INF00`为假. (7认同)
  • 我知道OP并没有真正要求这个,但作为一个方便的测试,如果你有其中一个神奇的值,`myfloat == myfloat`将返回false. (3认同)
  • 不确定其他配置,但在Windows 7/Visual Studio 2010上.float nan = sqrtf(-1.0f); nan == nan; //评估为真......与tenpn所说的相反......(作者:Yevgen V) (2认同)
  • @Jeff 这可能与优化有关。请参阅 [相关文档页面](https://msdn.microsoft.com/en-us/library/e7s85ffb.aspx)。 (2认同)

use*_*679 6

对于任何想知道-1.#IND00and之间的区别的人-1.#IND(问题特别提出的问题,并且没有任何答案解决):

-1.#IND00

这特别意味着一个非零数除以零,例如3.14 / 0( source )

-1.#IND(的同义词NaN

这意味着四件事(见一个维基来自):

1)sqrtlog负数

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

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

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