周波数の計算方法が変わった? (その10)
これまでの定数と配列を使った方法と新しい計算式方法を FreqTest.javaで比較して見ます。
class FreqTest { static final int KB = 88; static final double Oct = 12; static final double AA = 440; static final double HI = Math.pow(2, (1.0/Oct)); static double[] Keyf; public static void main(String argv[]) { Keyf = new double[KB]; initFreq(); double f0, f1, dif; for (int i = 0; i < KB; i++) { f0 = Keyf[i]; f1 = getFreq(i); dif = f0-f1; System.out.println((i+1)+": "+f0+" "+f1+" "+dif); } } static public double getFreq(int key) { key++; return AA*Math.pow(2, (key-49)/Oct); } static public void initFreq() { int ak = 49-1; Keyf[ak] = AA; for (int i = ak+1; i < KB; i++) Keyf[i] = Keyf[i-1]*HI; for (int i = ak-1; i >= 0; i--) Keyf[i] = Keyf[i+1]/HI; } }
その出力結果です。
key#: 定数配列 [Hz]: 計算式 [Hz] : 差 ---------------------------------------------------------------- 1: 27.499999999999936 27.5 -6.394884621840902E-14 13: 54.9999999999999 55.0 -9.947598300641403E-14 25: 109.99999999999987 110.0 -1.2789769243681803E-13 37: 219.99999999999986 220.0 -1.4210854715202004E-13 49: 440.0 440.0 0.0 61: 880.0000000000003 880.0 3.410605131648481E-13 73: 1760.000000000001 1760.0 9.094947017729282E-13 85: 3520.000000000004 3520.0 4.092726157978177E-12 88: 4186.009044809583 4186.009044809578 -5.4569682106375694E-12 ----------------------------------------------------------------
小数点以下12〜14桁の誤差は仕方がないと諦めていました;