【发布时间】:2011-01-04 21:05:37
【问题描述】:
我在搞乱傅立叶变换。现在我创建了一个实现 DFT 的类(不做任何像 FFT atm 之类的事情)。这是我使用的实现:
public static Complex[] Dft(double[] data)
{
int length = data.Length;
Complex[] result = new Complex[length];
for (int k = 1; k <= length; k++)
{
Complex c = Complex.Zero;
for (int n = 1; n <= length; n++)
{
c += Complex.FromPolarCoordinates(data[n-1], (-2 * Math.PI * n * k) / length);
}
result[k-1] = 1 / Math.Sqrt(length) * c;
}
return result;
}
这些是我从Dft({2,3,4})得到的结果
嗯,看起来还不错,因为这些是我所期望的值。只有一件事让我感到困惑。这一切都与双打的四舍五入有关。
首先,为什么前两个数字不完全相同(0,8660..443 8)与(0,8660..443)。为什么它不能计算出你期望的零。我知道 2.8E-15 非常接近于零,但事实并非如此。
任何人都知道这些边际错误是如何发生的,并且如果我可以并且想要对此做些什么。
似乎没有真正的问题,因为它只是小错误。但是,如果您要比较 2 个值,如何处理这些舍入误差。
5,2 + 0i != 5,1961524 + i2.828107*10^-15
干杯
【问题讨论】:
-
确实如此,但是,如果我想比较这些值,它会说它们不一样。您将如何处理。
-
阅读此内容:docs.sun.com/source/806-3568/ncg_goldberg.html 并在编写另一行代码之前了解所有内容。
-
@Eric,我已经阅读了介绍并快速阅读了它,它似乎很好地解释了我想要理解的内容。它正在打印 atm,所以今晚我有一个很好的阅读 xD
标签: c# floating-point double fft