我正在尝试在 C 中实施一个程序,使用 fft计算非常大的n(高达一百万)的 factorial strong>和二进制拆分方法。
我已经实现了一个简单的库来表示任意精度整数。 要计算 fft 和 ifft ,我使用中的 twofft.c 和 four1.c 例程C中的数字配方“
最多一个n,一切都正确,但是当数字(浮动数组)太大时, ifft (用four1计算),在规范化和舍入后,有错误的值
例如,如果我有两个数字,其中2000个数字以40个零结尾,并且我必须将它们相互相乘(使用fft),当我计算ifft时,一些结束的零变为“一”。 发生这种情况是因为当我对其中一个“零”(例如0,50009)进行舍入时,它们变为“一个”。 现在,我不知道我的实现是否错误,或者我是否必须以不同的方式舍入这些数字。 我尝试使用二元拆分方法和素数因子分解,但对于 n> = 9000 ,结果是错误
有办法解决这个问题吗? 感谢您的关注,对不起我的英语不好。
答案 0 :(得分:1)
你如何表示任意精度整数?
我的意思是你实际使用的是哪种类型?
你能告诉我们你的代码吗?
如果你觉得很懒,你可以克隆我几个月前做过的这个项目: https://github.com/nomadster/ESP
编辑:
通过本声明进一步阅读你的帖子
“发生这种情况是因为当我将其中一个”零“(例如0,50009)四舍五入时,它们变成了”一个“”
你还没有意识到fft乘法仅在舍入误差小于0.5时才有效。 因此,在我看来(当且仅当我正确地解释了您的神秘消息时)您使用的浮点类型不具备所需的精度。
答案 1 :(得分:1)
记录:
我还注意到来自数字配方的four1.c中ifft返回的错误值。我只测试了N = 256个复数值作为输入,以某种方式组装,它们应该产生一个真正的时域信号。
必须对得到的时域向量进行镜像(从头到尾,反之亦然......)并将其移位一,以与其他实现的IFFT对应。 (我测试了numpy.fft.ifft,octave的ifft和一个没有任何优化的逆离散傅立叶变换,只是基于IDFT公式,这应该是绝对正确的。)
数字收件人提供的版本中必须存在基本算法错误。在他们的书中没有描述与这个问题相关的内容。