math.log()导致" ValueError:数学域错误"

时间:2016-01-01 00:26:26

标签: python math frequency midi

这是MIDI音符转换器的频率,但我似乎无法使数学运算正常。具体来说,使用T=np.linspace(a,b,num=N+1)函数。这将在大多数情况下产生69.0的输出,但它通常输出" ValueError:数学域错误",如果我输入低于440的任何数字。我该如何解决?

math.log()

2 个答案:

答案 0 :(得分:1)

这是因为Python 2使用整数除法。低于440的任何内容将评估为0,然后传递给math.log()

>>> 500/440
1
>>> 440/440
1
>>> 439/440
0
>>> math.log(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: math domain error

最简单的方法是通过将此行放在文件的顶部来启用Python 3样式,即所谓的真正除法:

from __future__ import division

现在Python 2的行为与您预期的一样:

>>> 439/440
0.9977272727272727
>>> math.log(439/440)
>>> math.log(439/440)
-0.0022753138371355394

作为替代方案,您可以将被除数和/或除数转换为浮点数:

d=69+(12*math.log(int(f)/440.0))/(math.log(2))

d=69+(12*math.log(float(f)/440))/(math.log(2))

答案 1 :(得分:0)

如果是Python 2,它看起来像整数除法使得括号中的乘积不精确。尝试除以440.0。