我正在解决一些加密问题,
我需要4.157786362549383e+37
的立方根,它会给我3464341716380.1113
x = x ** (1. / 3)
我觉得起初很奇怪,所以我尝试了:
x=1000
print(x)
x= pow(x,1/3)
print(x)
但获得了9.99999998
我甚至尝试了else。但我得到了同样的结果。有什么不对?如何计算真正的立方根?
答案 0 :(得分:1)
由于浮点运算,这很难表示。
使用decimal稍微解决了它,但在某些数字中仍然存在问题,并且只允许舍入到积分。尝试使用小数,如下:
>>> (1000 ** (Decimal(1)/3)).to_integral_exact()
Decimal('10')
答案 1 :(得分:0)
在处理计算机上的浮点数时这是正常的。没有小数部分可以精确地用二进制表示,它处理2的负幂,所以你需要习惯得到非常接近的近似值。
在这种特定情况下,如果您知道结果应该是整数,只需使用round()
。
答案 2 :(得分:0)
在硬件数值表示的准确性范围内,两个答案都是正确的。 1/3是二进制的重复“十进制”:0.010101010101 ... 它无法准确表示。
如果你想要一个“真正的”立方根,你需要实现一个算法来处理你认为有用的舍入问题和极端情况。鉴于表示问题,您当然可以覆盖整数多维数据集。但是,即使是简单的情况,例如cube_root(1.728)=> 1.2,会有问题:十进制数字都不能精确地转换为二进制数。
答案 3 :(得分:0)
正如其他答案中所讨论的,这是由于浮点数的精度有限。除非你的数学是象征性的,否则它不可能准确地表示值。如果您的精度有限,但只需要比内置数据类型更精确,我建议使用任意精度算术库,例如this one。