Sun*_*y88 22 python floating-point
在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
Run Code Online (Sandbox Code Playgroud)
或者我需要这样做吗?:
epsilon = 0.000000000001
def is_triangular2(x):
num=(1/2) * (math.sqrt(8*x+1)-1 )
return abs(int(num) - num)<epsilon
Run Code Online (Sandbox Code Playgroud)
我检查了两个函数返回x的相同结果,最多为1,000,000.但我不确定一般来说int(x)== x将始终正确地确定一个数是否是整数,因为例如5的情况表示为4.99999999999997等.
据我所知,第二种方法是正确的,如果我用C语言,但我不确定Python 3.
ndp*_*dpu 32
is_integer
python float类型中有函数:
>>> float(1.0).is_integer()
True
>>> float(1.001).is_integer()
False
>>>
Run Code Online (Sandbox Code Playgroud)
Sve*_*ach 10
你的实现都有问题.实际上你可能会遇到类似的事情4.999999999999997
,因此使用int()
不是一种选择.
我会采用一种完全不同的方法:首先假设你的数字是三角形的,并计算n
那种情况下的情况.在第一步中,你可以慷慨地回合,因为如果数字实际上是三角形的话,只需要得到正确的结果.接下来,n * (n + 1) / 2
为此计算n
,并将结果与之比较x
.现在,您正在比较两个整数,因此没有任何不准确之处.
n
通过扩展可以简化计算
(1/2) * (math.sqrt(8*x+1)-1) = math.sqrt(2 * x + 0.25) - 0.5
Run Code Online (Sandbox Code Playgroud)
并利用它
round(y - 0.5) = int(y)
Run Code Online (Sandbox Code Playgroud)
为积极的y
.
def is_triangular(x):
n = int(math.sqrt(2 * x))
return x == n * (n + 1) / 2
Run Code Online (Sandbox Code Playgroud)
你会想做后者.在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
Run Code Online (Sandbox Code Playgroud)
此外,由于epsilon是"机器可以区分两个浮点数的最小差异",因此您需要在函数中使用<=.
编辑:在阅读下面的评论之后,我回头看了一下这本书,它特别说"这是一个简单的函数,用于比较浮点数的相等性和机器精度的极限".我相信这只是将浮点数与极端精度进行比较的一个例子,但事实上,许多浮点计算引入了错误,这种情况应该很少使用.我把它描述为在我的答案中比较的"最准确"的方式,在某种意义上它是正确的,但很少在将浮点数或整数与浮点数进行比较时的意图.基于函数的"问题域"而不是使用sys.float_info.epsilon选择值(例如:0.00000000001)是正确的方法.
感谢S.Lott和Sven Marnach的更正,如果我带领任何人走错路,我会道歉.
归档时间: |
|
查看次数: |
19516 次 |
最近记录: |