y = x / n和y = x *(1 / n)的结果不同

时间:2019-10-27 15:26:24

标签: c++ floating-point

这种朴素的离散傅立叶变换实现

std::vector<Complex> dft(const std::vector<Complex>& f) {
    const int fSize = f.size();
    const double invSize = 1.0 / fSize;
    constexpr double pi2 = 2.0 * M_PI;

    double angle, sine, cosine;

    std::vector<Complex> dft(fSize, {0, 0});

    for (int i = 0; i < fSize; ++i) {
        for (int j = 0; j < fSize; ++j) {
            angle = pi2 * i * j * invSize;
            sine = sin(angle);
            cosine = cos(angle);
            dft[i].re += f[j].re * cosine + f[j].im * sine;
            dft[i].im += -f[j].re * sine + f[j].im * cosine;
        }
    }
    return dft;
}

对某些数据给出以下结果(不重要)

1. {-0.00000038201086502 0.00000000000000000},
2. {-0.00000040302553015 -0.00000001563922637},
3. {-0.00000043769125518 -0.00000003402005333},
4. {-0.00000164761818487 -0.00000019257894896}

但是如果我们不使用invSize常量并将角度定义为

angle = pi2 * i * j / fSize;

对于相同的数据,我们将获得以下结果

1. {-0.00000038201086502 0.00000000000000000},
2. {-0.00000040302553033 -0.00000001563922643},
3. {-0.00000043769125391 -0.00000003402005341},
4. {-0.00000164761818622 -0.00000019257895092}

为什么会发生这种情况,更精确的结果是什么?

0 个答案:

没有答案