如何用Python编写这个公式?

2024-09-29 20:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我应该为2, 1, 5得到True,但我不是。我的功能怎么了?


Tags: lambda功能truegetreturnisdefprint
2条回答

幂运算符(**)的优先级高于除法运算符(/)。所以你需要设置括号:

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那:

lolz

因此:

lolzz

现在,由于浮点运算在基于二进制的known reasons系统中不精确,第一个公式很难精确计算。但是,第二个函数不涉及无理函数,而且abc是整数,因此计算起来要容易得多,不存在浮点精度错误。

以下是智能解决方案:

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

相关问题 更多 >

    热门问题