在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返回相同的结果,最大可达1000000。但我不确定一般来说int(x)==x是否总是正确地确定一个数字是否是整数,因为例如5被表示为4.999999999997等
据我所知,第二种方法是正确的,如果我用C语言来实现,但是我对Python 3不太确定。
两种实现都有问题。实际上,可能会发生这样的事情:你最终得到了
4.999999999999997
,所以使用int()
不是一个选项。我会采用完全不同的方法:首先假设你的数字是三角形的,然后计算在这种情况下
n
是什么。在第一步中,您可以进行大量的舍入,因为只有当实际的数字是三角形时,才需要得到正确的结果。接下来,计算这个n * (n + 1) / 2
,并将结果与x
进行比较。现在,您正在比较两个整数,因此没有不准确的地方了。通过展开可以简化
n
的计算利用它
对于阳性的
y
。python float类型中有^{} 函数:
你要做后者。在Python 3编程中,下面的例子是比较
另外,由于epsilon是“机器可以区分两个浮点数的最小差异”,因此您需要在函数中使用<;=来区分。
编辑:在阅读了下面的评论之后,我回顾了这本书,书中特别提到“这里有一个简单的函数,用来比较浮点值是否等于机器精度的极限”。我相信这只是一个比较浮点数和极端精度的例子,但事实上,许多浮点数计算都会引入误差,如果使用这种方法的话应该很少。在我的回答中,我将其描述为“最精确”的比较方式,这在某种意义上是正确的,但在将浮点数或整数与浮点数进行比较时,却很少使用这种方式。根据函数的“问题域”选择一个值(例如:0.0000000000 1)而不是使用sys.float_info.epsilon是正确的方法。
感谢S.Lott和Sven Marnach的更正,如果我引导任何人走错了路,我深表歉意。
相关问题 更多 >
编程相关推荐