Memory 是否达到GMP整数大小限制?

Memory 是否达到GMP整数大小限制?,memory,gmp,Memory,Gmp,我已经用GMP编写了一个Toom乘法的实现。我测试了大约7000位(23000位)的2个数字的乘法,结果非常好。然而,当我尝试使用70000位(230000位)时,程序开始产生错误的答案 我使用的是32位系统。GMP是否会耗尽内存以供使用?我没有得到任何错误,所以我认为这是不可能的。如果不是这样的话,我怀疑某个地方的精度有所下降 一般来说,GMP使用“malloc和friends”在堆上分配数据。如果无法正确分配数据,则会调用标准的abort()函数(因此进程应该简单地中止),请参阅memory

我已经用GMP编写了一个Toom乘法的实现。我测试了大约7000位(23000位)的2个数字的乘法,结果非常好。然而,当我尝试使用70000位(230000位)时,程序开始产生错误的答案


我使用的是32位系统。GMP是否会耗尽内存以供使用?我没有得到任何错误,所以我认为这是不可能的。如果不是这样的话,我怀疑某个地方的精度有所下降

一般来说,GMP使用“malloc和friends”在堆上分配数据。如果无法正确分配数据,则会调用标准的
abort()
函数(因此进程应该简单地中止),请参阅
memory.c

ret = malloc (size);
if (ret == 0)
  {
    fprintf (stderr, "GNU MP: Cannot allocate memory (size=%lu)\n", (long) size);
    abort ();
  }

如果没有更多的细节(见我的评论),很难判断出你的计算出了什么问题。

你的问题没有任何意义。它读起来像“我的程序产生了错误的答案,可能是因为GMP内存不足吗?”这看起来像是一个完全随机的诊断,与您对问题的描述毫无相似之处。你应该花更多的精力来描述问题,如果你想提出一个诊断,你应该提供一些证据来支持这个诊断。否则,让其他人来诊断问题。@DavidSchwartz我不明白我的问题为什么没有意义。该程序明确适用于较小的值,但不适用于较大的值;这就是为什么我认为存在精确性问题。这是我的证据,除了整个程序广泛使用GMP功能这一事实之外。与广泛使用和广泛审查的库(如GMP)相比,您的代码中的错误不是更可能吗?对于您的配置,肢体的大小是多少,即
sizeof(mp\u limb\t)
(即使您有32位操作系统,limb也可能被定义为
无符号长
,因为您的CPU可能有64位寄存器)?如果Toom乘法是由库本身实现的,为什么要实现它(也就是说,
mpz_mul
“重定向”到基本上基于操作数的正确算法)?库为各种mul实现定义了多个阈值(在gmp impl.h中定义为分支数)。对于非常大的操作数(千个分支),可能会优先使用FFT乘法。