我真的不知道怎么写这个。这就是我尝试的方式:
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
True
我应该2, 1, 5
,但我不是。我的功能出了什么问题?
答案 0 :(得分:6)
进行一些计算,I found out:
因此:
现在,由于浮点运算对known reasons的基于二进制的系统不精确,第一个公式很难精确计算。但是,第二个更容易计算没有浮点精度错误,因为它不涉及非理性函数和a
,b
和{{1}是整数。
这是智能解决方案:
c
答案 1 :(得分:1)
幂算子(**
)的优先级高于除法1(/
)。所以你需要设置括号:
f = lambda x: x ** (1./3)
但是,浮点运算并不精确,所以你必须比较一些小的不确定性:
def is_cardano_triplet(a, b, c):
f = lambda x: x ** (1. / 2)
g = lambda x: x ** (1. / 3)
return abs(g(a + b*f(c)) + g(a - b*f(c)) - 1) < 1e-10
现在你遇到了问题,负数只允许奇数的根,但浮点数不准确,所以你必须手工处理负数:
def is_cardano_triplet(a, b, c):
f = lambda x: x ** (1. / 2)
g = lambda x: (-1 if x<0 else 1) * abs(x) ** (1. / 3)
return abs(g(a + b*f(c)) + g(a - b*f(c)) - 1) < 1e-10
现在
print is_cardano_triplet(2,1,5)
结果为True
。