我听说浮点FFT的非准确性,特别是cos和sin函数 - 与double相比,数字完全不同。
我问,因为我重写了一些代码 - Cooley-Tukey FFT算法;结果不同。原始项目使用double,new是float。这是我的错误吗?我从matlab和c ++编写这段代码......并且很少问matlab的两倍是和java和c + double一样?
float PI=3.141592;
// Make sure n is a power of 2
// if (n != (1 << m))
// throw new RuntimeException("FFT length must be power of 2");
// precompute tables
for (int i = 0; i < n / 2; i++) {
cosa[i] = cos (-2 * PI * i / n);
sina[i] =sin (-2 * PI * i / n);
}
答案 0 :(得分:3)
对于大多数FFT算法,“非精度”大致在O(NlogN)处随输入元素的大小增加;和KCS / IEEE754浮点数具有大约24位的精度。因此,对于不是超长的FFT,数据中的噪声,不完美的抗混叠和输入的量化通常都大于算术误差。
只有当你真正关心超过大约6位小数点的有效和准确数据时,float和double之间的结果才会“完全不同”。