3

我正在尝试在C中实现一个程序,该程序使用fft二进制拆分方法计算非常大的 n(最多一百万)的阶乘

我已经实现了一个简单的来表示任意精度整数。为了计算fftifft,我使用了“ C 中的数字食谱”中twofft.cfour1.c例程

直到某个 n,一切正常,但是当数字(浮动数组)太大时,ifft(用four1计算)在归一化和四舍五入之后有错误的值。

例如,如果我有两个以 40 个零结尾的 2000 位数字,并且我必须将它们相乘(使用 fft),当我计算 ifft 时,一些结尾的零变成“一”。发生这种情况是因为当我将其中一个“”(例如 0,50009)四舍五入时,它们变成了“”。现在,我不知道我的实现是否错误,或者我是否必须以不同的方式四舍五入这个数字。我尝试使用二元拆分方法素数分解,但是对于n >= 9000,结果是错误的。

有办法解决这个问题吗?感谢您的关注,并为我糟糕的英语感到抱歉。

4

2 回答 2

1

你如何表示任意精度整数?

我的意思是你实际使用的是什么类型?

你能告诉我们你的代码吗?

如果你真的很懒,你可以克隆我几个月前做的这个项目: https ://github.com/nomadster/ESP

编辑:

通过进一步阅读您的帖子,我认为此声明

“发生这种情况是因为当我将其中一个“零”(例如 0,50009)四舍五入时,它们变成了“一””

您仍然没有意识到 fft 乘法仅在舍入误差小于 0.5 时才有效。所以在我看来(当且仅当我正确解释了你的神秘信息时)你使用的浮点类型没有所需的精度。

于 2013-04-09T13:53:05.577 回答
1

作为记录:

我还注意到 ifft 从数字配方中的four1.c 返回的错误值。我只用 N=256 个复数值作为输入对其进行了测试,以某种方式组装,它们应该产生一个真正的时域信号。

生成的时域向量必须被镜像(从头到尾,反之亦然……)并移位一以与其他实现的 IFFT 相对应。(我仅基于 IDFT 公式测试了 numpy.fft.ifft、八度音阶的 ifft 和离散傅里叶逆变换,没有任何优化,这应该是绝对正确的)。

数字食谱提供的版本中必须存在基本算法错误。在他们的书中没有描述与这个问题相关的内容。

于 2015-12-10T14:35:42.200 回答