雑記帳 (Notebook)


周波数の計算方法が変わった? (その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桁の誤差は仕方がないと諦めていました;