对数之间的Python模数

时间:2017-12-16 00:24:35

标签: python

我试图在Python中检查math.log(x,base)是否有小数:

import math

# math.log(8, 2) = 3
print math.log(8)
print math.log(2)
print math.log(8) / math.log(2)
print 2.07944154168 % 0.69314718056
print math.log(8) % math.log(2)

输出是:

2.07944154168
0.69314718056
3.0
0.0
0.69314718056

为什么第四行打印行返回零但第五行不返回?

2 个答案:

答案 0 :(得分:1)

这是我使用python 3

>>> print (math.log(8))
2.0794415416798357
>>> print (math.log(2))
0.6931471805599453
>>> print (math.log(8) / math.log(2))
3.0
>>> print (2.07944154168 % 0.69314718056)
0.0
>>> print (math.log(8) % math.log(2))
0.6931471805599452
>>> print (2.0794415416798357 % 0.6931471805599453)
0.6931471805599452

看起来在你的例子中(python 2?),math.log的精度还不够。

答案 1 :(得分:1)

这可能会因为重复而被关闭,但只有这样才能看出它是如何发挥作用的:

>>> import math
>>> math.log(8)
2.0794415416798357
>>> math.log(2)
0.6931471805599453

现在假设你需要计算math.log(8) % math.log(2)。将math.log(2)分为math.log(8)后,您需要计算余数。让我们看看,它会进行3次吗?

  0.6931471805599453
+ 0.6931471805599453
+ 0.6931471805599453
--------------------
  2.0794415416798359

哇!我们超过了2.0794415416798357的值,这意味着它实际上是两次:

  0.6931471805599453
+ 0.6931471805599453
--------------------
  1.3862943611198906

好的,剩下的是什么?

  2.0794415416798359
- 1.3862943611198906
--------------------
  0.6931471805599453

所以TL;由于舍入错误,你的余数接近math.log(2)。它不会进入三次。只剩下math.log(2)剩下的两次。

是的,当你打印商标3.0时,是的,但这又是浮点数的所有舍入错误,这不是Python独有的。