Я возиться с преобразованиями Фурье.Теперь я создал класс, который выполняет реализацию 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
Cheers