2013-12-11 20 views
1

我的代码块看起来是这样的:是否有可能有两个浮体,其失败的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。还有没有其他方法可以让两个浮点数前三个比较失败?

+1

我相信是的。 'Inf == Inf'和'-Inf == -Inf';除了'NaN'之外,这些是我所知道的唯一奇怪的花车。 – Amadan

+1

负数和正数零也相等。 –

+1

数学模块还包含'isnan'函数供您明确测试。 – PaulMcG

回答

2

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)是比较器的状态字。文件摘录:

enter image description here

在较低水平 - 比较2后漂浮程序获取FPU的状态字,并根据这些3 4的状态标志决定做什么。由于至少有一个比较参数是NaN,所以最后一种情况下(无序),并且我已经提到过(>,<,==)都不会返回true,因此最终会返回您的其他声明

相关问题