我知道FFT函数不能用于NAN值。我们使用inerpolation来获取那些NAN,或者我们用零替换NAN。然而,我想知道为什么FFT不适用于NAN? FFT基本上是在用不同的谐波相乘后对时间序列求和,并且大多数库具有在跳过NAN值时执行求和的功能。 谢谢
答案 0 :(得分:2)
执行浮点计算的langages和编译器(C,C++)和次级编译库(如FFTW)的最新版本依赖于 IEC 60559或IEEE 754标准的浮点数算术,使用float
或double
等类型,除非激活ggc' s -ffast-math
等标记。这些标准描述了float
和double
的预期行为:大多数SIMD指令都应符合这些标准(请参阅this course和Checking if a double (or float) is NaN in C++)。因此,使用SIMD指令的库(Blas Lapack)可能会以相同的方式运行。
David Goldberg在"What Every Computer Scientist Should Know About Floating-Point Arithmetic "中对NaN的态度
虽然IEEE标准定义了基本的浮点运算,如果任何操作数是NaN,则返回NaN,这可能并不总是复合运算的最佳定义...
A few words about the operations on NaN in IEEE 754, in 1985:
如果没有发生陷阱并且如果要传递浮点结果,则每个涉及信令NaN或无效操作(7.1)的操作都应该提供一个安静的NaN作为其结果。
因此,对于离散傅立叶变换,输入中的单个NaN可能会污染整个输出数组。由于this one proposed in a draft之类的规则,这种行为可能会出现这种情况:
具有至少一个无限部分的复数或虚数值被视为无穷大(即使其它部分是NaN)。
有理由不用默认值覆盖NaN:
关于NaN的附加资料来源: