在 Python 3 中,我正在检查给定值是否为三角形,也就是说,对于某个正整数,它可以表示为 n * (n + 1) / 2
n
。
我可以只写:
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。
原文由 Sunny88 发布,翻译遵循 CC BY-SA 4.0 许可协议
你会想要做后者。在 Programming in Python 3 中给出了以下示例作为比较的最准确方法
此外,由于 epsilon 是“机器可以区分两个浮点数的最小差异”,因此您需要在函数中使用 <= 。
编辑:阅读下面的评论后,我回头看了看这本书,它专门说“这是一个简单的函数,用于比较浮点数是否等于机器精度的极限”。我相信这只是一个将浮点数与极端精度进行比较的例子,但事实上许多浮点数计算都会引入错误,这应该很少被使用。我将其描述为我的答案中“最准确”的比较方式,这在某种意义上是正确的,但在将浮点数或整数与浮点数进行比较时很少有意图。根据函数的“问题域”而不是使用 sys.float_info.epsilon 选择一个值(例如:0.00000000001)是正确的方法。
感谢 S.Lott 和 Sven Marnach 的更正,如果我误导了任何人,我深表歉意。