检查float是否等价于python中的整数值

2024-05-16 15:00:57 发布

您现在位置:Python中文网/ 问答频道 /正文

在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不太确定。


Tags: 函数importreturnisdefmathabssqrt
3条回答

两种实现都有问题。实际上,可能会发生这样的事情:你最终得到了4.999999999999997,所以使用int()不是一个选项。

我会采用完全不同的方法:首先假设你的数字是三角形的,然后计算在这种情况下n是什么。在第一步中,您可以进行大量的舍入,因为只有当实际的数字是三角形时,才需要得到正确的结果。接下来,计算这个n * (n + 1) / 2,并将结果与x进行比较。现在,您正在比较两个整数,因此没有不准确的地方了。

通过展开可以简化n的计算

(1/2) * (math.sqrt(8*x+1)-1) = math.sqrt(2 * x + 0.25) - 0.5

利用它

round(y - 0.5) = int(y)

对于阳性的y

def is_triangular(x):
    n = int(math.sqrt(2 * x))
    return x == n * (n + 1) / 2

python float类型中有^{}函数:

>>> float(1.0).is_integer()
True
>>> float(1.001).is_integer()
False
>>> 

你要做后者。在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是“机器可以区分两个浮点数的最小差异”,因此您需要在函数中使用<;=来区分。

编辑:在阅读了下面的评论之后,我回顾了这本书,书中特别提到“这里有一个简单的函数,用来比较浮点值是否等于机器精度的极限”。我相信这只是一个比较浮点数和极端精度的例子,但事实上,许多浮点数计算都会引入误差,如果使用这种方法的话应该很少。在我的回答中,我将其描述为“最精确”的比较方式,这在某种意义上是正确的,但在将浮点数或整数与浮点数进行比较时,却很少使用这种方式。根据函数的“问题域”选择一个值(例如:0.0000000000 1)而不是使用sys.float_info.epsilon是正确的方法。

感谢S.Lott和Sven Marnach的更正,如果我引导任何人走错了路,我深表歉意。

相关问题 更多 >