python:math.sqrt(x)函数有多准确?

时间:2012-08-13 06:52:43

标签: c# java python

考虑Python中的以下代码片段:

m = int(math.sqrt(n))

对于n = 25,它应该给出m = 5(并且它在我的shell中)。但是根据我的C经验,我知道使用这样的表达式是一个坏主意,因为sqrt函数可能返回比实际值稍低的值,然后在舍入后我可能得到m = 4而不是m = 5.这个限制是否也是参与python?如果是这种情况,那么在python中编写这样的表达式的最佳方法是什么?如果我使用Java或C#会发生什么? 此外,如果有任何不准确之处,有哪些因素可以控制它的数量?

3 个答案:

答案 0 :(得分:7)

要进行正确的舍入,请使用round();它舍入到最接近的整数,但返回一个浮点数。然后你可以从结果中构造一个int

(很可能你的代码不是性能关键的,你永远不会注意到与round()相关的任何减速。如果你这样做,你可能应该使用numpy。)

答案 1 :(得分:3)

如果您非常关注sqrt的准确性,可以使用标准库中的decimal.Decimal class,它提供了自己的sqrt函数。可以将Decimal类设置为比常规Python float更高的精度。也就是说,如果你正在进行四舍五入也许并不重要。 Decimal类会产生完全数字(来自文档):

  

[十进制]的精确性延续到算术中。在十进制浮点数,   0.1 + 0.1 + 0.1 - 0.3完全等于零。在二进制浮点数中,结果为5.5511151231257827e-017。虽然接近零,但是   差异阻止可靠的平等测试和差异可以   积累。因此,在会计中首选十进制   具有严格的等式不变量的应用程序。

答案 2 :(得分:1)

解决方案很简单。如果您期望整数结果,请使用int(math.sqrt(n)+。1)。如果该值略大于或小于整数结果,则它将舍入到正确的值。