我真的不知道怎么写这个.这是我尝试的方式:
def is_cardano_triplet(a, b, c):
f = lambda x: x ** 1. / 2
g = lambda x: x ** 1. / 3
return g(a + b*f(c)) + g(a - b*f(c)) == 1
print is_cardano_triplet(2,1,5) # I should get True
Run Code Online (Sandbox Code Playgroud)
我应该得到True的2, 1, 5,但我不是.我的功能出了什么问题?
做了一些计算,我发现:
因此:
现在,由于已知原因浮点运算对基于二进制的系统不精确,第一个公式很难精确计算.但是,第二个更容易计算而没有浮点精度误差,因为它不涉及无理函数a,b并且c是整数.
这是智能解决方案:
def is_cardano_triplet(a, b, c):
return (a + 1)**2 * (8*a - 1) - 27*b**2*c == 0
>>> is_cardano_triplet(2, 1, 5)
True
Run Code Online (Sandbox Code Playgroud)