音乐音高分值计算中对数运算的浮点数精度问题咨询
音分计算偏差问题解答
核心结论
你观测到的偏差完全不是浮点数精度导致的,是你混淆了「纯律音程的理论音分值」和「十二平均律的标称音分值」的固有差异,你的代码计算结果是完全准确的。
具体原因分析
- 十二平均律的定义是将1个八度(频率比2:1)等分为12个半音,每个半音对应100音分,因此:
- 平均律纯五度占7个半音,标称值为700音分,对应频率比为
2^(7/12) ≈ 1.4983,而非你测试用的3/2=1.5 - 平均律大三度占4个半音,标称值为400音分,对应频率比为
2^(4/12) ≈ 1.2599,而非你测试用的5/4=1.25
- 平均律纯五度占7个半音,标称值为700音分,对应频率比为
- 你测试用的3:2、5:4都是纯律的音程频率比,纯律追求音程的整数频率比和谐性,和十二平均律的音分值本就存在固有差:
- 纯律纯五度的理论音分值为
1200 * log2(3/2) ≈ 701.96,天然比平均律纯五度高约2音分,和你计算结果完全一致 - 纯律大三度的理论音分值为
1200 * log2(5/4) ≈ 386.31,天然比平均律大三度低约14音分,和你的计算结果完全匹配
- 纯律纯五度的理论音分值为
浮点数精度的实际影响
你当前用的双精度浮点数计算log2的误差在1e-15量级,折算到音分最多是1e-12音分,完全不可能造成可感知的、甚至1音分级别的偏差。
验证方法
你可以用平均律对应的频率做测试:输入平均律纯五度频率440 * 2**(7/12)和440计算,得到的结果会无限接近700,误差可以忽略。
内容的提问来源于stack exchange,提问作者Chris A.
相关产品推荐
相关产品推荐

