2024-09-29 20:24:22 发布
网友
我真的不知道怎么写得对。我就是这么想的:
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
我应该为2, 1, 5得到True,但我不是。我的功能怎么了?
2, 1, 5
True
幂运算符(**)的优先级高于除法运算符(/)。所以你需要设置括号:
**
/
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是整数,因此计算起来要容易得多,不存在浮点精度错误。
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
幂运算符(
**
)的优先级高于除法运算符(/
)。所以你需要设置括号:不过,浮点运算并不精确,因此必须与一些小的不确定性进行比较:
现在你遇到了一个问题,负数只允许用于奇数的根,但是浮点并不精确,所以你必须手动处理负数:
现在
结果是
True
。做一些计算,I found out那:
因此:
现在,由于浮点运算在基于二进制的known reasons系统中不精确,第一个公式很难精确计算。但是,第二个函数不涉及无理函数,而且
a
、b
和c
是整数,因此计算起来要容易得多,不存在浮点精度错误。以下是智能解决方案:
相关问题 更多 >
编程相关推荐