如何在 Python 中写出这个等式?
How do I write this equation in Python?
我真的不知道怎么写才对。我就是这样尝试的:
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
,但我没有。我的功能有什么问题?
幂运算符(**
)的优先级高于除法运算符(/
)。所以需要设置括号:
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
。
做一些计算,I found out:
因此:
现在,由于浮点运算在 known reasons 的基于二进制的系统上不精确,第一个公式很难精确计算。然而,第二个更容易计算,没有浮点精度错误,因为它不涉及无理函数和 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
我真的不知道怎么写才对。我就是这样尝试的:
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
,但我没有。我的功能有什么问题?
幂运算符(**
)的优先级高于除法运算符(/
)。所以需要设置括号:
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
。
做一些计算,I found out:
因此:
现在,由于浮点运算在 known reasons 的基于二进制的系统上不精确,第一个公式很难精确计算。然而,第二个更容易计算,没有浮点精度错误,因为它不涉及无理函数和 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