我如何用Python编写这个等式?

时间:2016-04-19 19:37:56

标签: python python-2.7

Cardano Triplets

我真的不知道怎么写这个。这就是我尝试的方式:

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,但我不是。我的功能出了什么问题?

2 个答案:

答案 0 :(得分:6)

进行一些计算,I found out

lolz

因此:

lolzz

现在,由于浮点运算对known reasons的基于二进制的系统不精确,第一个公式很难精确计算。但是,第二个更容易计算没有浮点精度错误,因为它不涉及非理性函数和ab和{{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