我试图在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
为什么第四行打印行返回零但第五行不返回?
答案 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独有的。