在Python 3中,我检查一个给定的值是否是三角形,也就是说,对于某个正整数n,它可以表示为n(n 1)/ 2
我可以写:
import math def is_triangular1(x): num=(1/2) * (math.sqrt(8*x+1)-1 ) return int(num)==num
还是我需要这样做? :
epsilon = 0.000000000001 def is_triangular2(x): num=(1/2) * (math.sqrt(8*x+1)-1 ) return abs(int(num) - num)<epsilon
我检查了这两个函数返回的结果相同,为x达到1,000,000。但是我不确定一般来说,一般来说,int(x)== x将始终正确地确定一个数字是否为整数,因为例如5表示为4.99999999999997等等。
据我所知,第二种方法是正确的,如果我在C中,但我不知道Python 3。
解决方法
你会想做后者。在Python 3编程中,以下示例是最准确的比较方法
def equal_float(a,b): #return abs(a - b) <= sys.float_info.epsilon return abs(a - b) <= chosen_value #see edit below for more info
此外,由于epsilon是“最小的差异,机器可以区分两个浮点数”,您将需要在您的函数中使用< =。 编辑:阅读下面的意见后,我回顾了这本书,具体说“这是一个简单的功能,用于比较浮体相对于机器精度的极限”。我相信这仅仅是将浮点数与极端精度进行比较的例子,但是事实上,使用许多浮点计算引入了错误,这很少会被使用。我将其表征为在我的答案中进行比较的“最准确”的方式,这在某种意义上是真实的,但是在将浮点数或整数与浮点数进行比较时很少使用。基于函数的“问题域”而不是使用sys.float_info.epsilon来选择一个值(例如:0.00000000001)是正确的方法。 感谢S.Lott和Sven Marnach的修改,如果我带领任何人走错路,我都道歉。