Floating point Cooley-Tukey FFT的精度-浮点与双精度

Floating point Cooley-Tukey FFT的精度-浮点与双精度,floating-point,double,fft,Floating Point,Double,Fft,我听说了浮点FFT的不精确性,特别是cos和sin函数的不精确性-与double相比有完全不同的数字 我这样问是因为我重新编写了一些代码-Cooley Tukey FFT算法;结果是不同的。原来的项目使用double,新的项目是float。那是我的错吗?我用Matlab和C++编写了这个代码…而且少问matlab的double跟java和c+double是一样的 float PI=3.141592; // Make sure n is a power of 2 // if (n != (1 &

我听说了浮点FFT的不精确性,特别是cos和sin函数的不精确性-与double相比有完全不同的数字

我这样问是因为我重新编写了一些代码-Cooley Tukey FFT算法;结果是不同的。原来的项目使用double,新的项目是float。那是我的错吗?我用Matlab和C++编写了这个代码…而且少问matlab的double跟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);
 }
float PI=3.141592;
//确保n是2的幂

//如果(n!=(1对于大多数FFT算法,“非精度”大约在O(NlogN)处增长与输入元素的大小有关;KCS/IEEE754浮点携带约24位精度。因此,对于不是超长的FFT,数据中的噪声、不完善的抗锯齿和输入量化通常大于算术误差


只有当您真正关心超过小数点后6位左右的有效和准确数据时,float和double之间的结果才会“完全不同”。

对于大多数FFT算法,“非准确度”增长大约为O(NlogN)与输入元素的大小有关;KCS/IEEE754浮点携带约24位精度。因此,对于不是超长的FFT,数据中的噪声、不完善的抗锯齿和输入量化通常大于算术误差


float和double之间的结果将“完全不同”只有当您真正关心超过小数点后6位左右的有效且准确的数据时。

您不清楚您在问什么。您是在问
浮点值
双精度
之间的精度有什么区别吗?您在原始项目中看到了什么结果,在重写的代码中看到了什么结果?您确定吗这些差异是由于浮点错误而不是由于bug引起的,通常,在C、C++、java和Matlab中,双< /C> >类型基本相同,但在具体实现中是不同的,并且在执行算术方面存在差异。此外,π,3.141592的值是不准确的。结果数据不准确。是的,我要求FFT中浮点和双精度之间的acc,因为我的结果完全不同。结果有时是带-的,原点是带+,,大多数值完全不同..“完全不同”不是一个有用的误差度量。如果预期结果和观察结果之间的差异小于n•log2(n)•2^-24•p,其中p是大于任何输入值的两个值的最小幂,则差异可能是浮点舍入的正常结果。即使某些值改变符号,这也是正确的,因为误差受所有输入的影响,与单个输出值不成正比。您观察到了哪些特定值,哪些您期望的具体值是多少?您使用的具体输入是什么?使用输入值大多为零但在单个位置有一个输入值的FFT,并改变包含该值的位置可能会很有用。这有时会暴露FFT实现中的问题。不清楚您在问什么。您在问有什么区别吗在<代码>浮点<代码> >代码>双<代码>之间,在原始项目中你看到了什么结果,在重写代码中你看到了什么结果?你确定这些差异是由于浮点错误而不是由于bug吗?通常,在C++、C++、java和MATLAB中,<>代码>双类型基本上是相同的,但是具体实现的变化,以及算法的执行方式存在差异。此外,您用于π3.141592的值不准确。不准确的数据不会得到准确的结果。是的,我要求FFT中浮点和双精度之间的acc,因为我的reslts完全不同。结果有时与-和原点i相同对于+,,大多数值都是完全不同的。“完全不同”不是一个有用的误差度量。如果预期结果和观察结果之间的差异大约小于n•log2(n)•2^-24•p,其中p是大于任何输入值的两个值的最小幂,则差异可能是浮点舍入的正常结果。即使某些值改变符号,这也是正确的,因为误差受所有输入的影响,与单个输出值不成正比。您观察到了哪些特定值,哪些您期望的具体值,以及您使用的具体输入是什么?使用输入值大多为零但在单个位置有一个输入值的FFT,以及改变包含该输入值的位置,可能会很有用。这有时会暴露FFT实现中的问题。O(对数N)误差与向量的长度有关(几何长度,而不是数组中元素的数量;即元素大小平方和的平方根)。绝对误差随输入元素大小的N•log(N)倍而增长。单个结果元素可能具有无限的相对误差(相对于理想值)。对于1024个元素,N•log(N) /2^24大约是百万分之600,而不是百万分之一。“随机机会”使大多数误差更小,但有些误差较大。O(对数N)误差与向量的长度有关(几何长度,而不是数组中元素的数量;即元素大小的平方和的平方根)。绝对误差随输入元素大小的N•log(N)倍而增长。单个结果元素可能具有无限的相对误差(相对于理想值)。对于1024个元素,N•log(N)/2^24约为百万分之600,而不是百万分之一。“随机机会”使大多数误差更小,但有些误差较大。