我的代码块看起来是这样的:是否有可能有两个浮体,其失败的LT,GT和EQ测试
if a > b:
pass
elif a < b:
pass
elif a == b:
pass
else:
# Can I assume that a or b is nan if I'm here?
我想知道,如果到达其他的最后一块必然意味着a或b是nan。还有没有其他方法可以让两个浮点数前三个比较失败?
我的代码块看起来是这样的:是否有可能有两个浮体,其失败的LT,GT和EQ测试
if a > b:
pass
elif a < b:
pass
elif a == b:
pass
else:
# Can I assume that a or b is nan if I'm here?
我想知道,如果到达其他的最后一块必然意味着a或b是nan。还有没有其他方法可以让两个浮点数前三个比较失败?
IEEE 754标准说:
5.7。比较 即使操作数格式不同,也应该可以比较所有支持的格式中的浮点数。比较确切,并且不会溢出也不会下溢。四种互斥关系可能是: 可能:小于,等于,大于和无序。当至少有一个操作数是NaN时,最后一种情况会出现 。每一个NaN都应该与无限量的东西比较,包括它本身。
这意味着如果任何或两个比较操作数的NaN - 结果OS >,<,==将是假的。
因为Python坚持IEE754标准,你可以安全地假设你的操作数,如果至少一个(<,>,==)是NaN的你在else语句结束。
您可以验证过程的:
import math
nan = float("nan")
a_and_b = [ (1.0, 3.0), (3.0, nan), (nan, 3.0), (nan, nan)]
for (a,b) in a_and_b:
print("a={} b={}".format(a,b))
if a > b:
print(' a>b')
elif a < b:
print(' a<b')
elif a == b:
print(' a==b')
else:
print(' else')
产量:
a=1.0 b=3.0
a<b
a=3.0 b=nan
else
a=nan b=3.0
else
a=nan b=nan
else
由于大多数电脑都有的x87 FPU所有浮点比较受到FCOM般的协处理器指令导致设置完成根据结果,4位(C0..C3)是比较器的状态字。文件摘录:
在较低水平 - 比较2后漂浮程序获取FPU的状态字,并根据这些3 4的状态标志决定做什么。由于至少有一个比较参数是NaN,所以最后一种情况下(无序),并且我已经提到过(>,<,==)都不会返回true,因此最终会返回您的其他声明
我相信是的。 'Inf == Inf'和'-Inf == -Inf';除了'NaN'之外,这些是我所知道的唯一奇怪的花车。 – Amadan
负数和正数零也相等。 –
数学模块还包含'isnan'函数供您明确测试。 – PaulMcG