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