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