1

我有一个问题,我需要准备好探索比 unsized long long 可以表示的更大范围的数字(范围由 3^(n*n) 表示)。该社区已建议我将 GMP 用于多精度数字。因为我需要一次遍历一个数字的范围,所以我需要一种方法来轻松地增加我的计数器。

我的冲动是使用“mpz_add_ui(my_counter, my_counter, 1UL);”,但我担心将我的计数器作为返回参数和加数传递可能会导致结果被破坏。如果函数在计算答案时更改了返回运算符,它可能会更改数字,从而导致答案错误。递增不太可能造成任何麻烦,但是添加两个大的 mpz_t 呢?或者乘法,甚至是指数?文件无法平息或证实我的担忧。我试过查看源代码,但是宏、稀疏注释和从一个文件跳转到另一个文件的组合让我得出结论,我还不够优秀,还不足以成为一名程序员。

为了安全起见,我编写了一个函数,它显示了我相当肯定会起作用的格式,但我宁愿避免它,因为我确信它会减慢我的程序速度:

void mpz_increment(mpz_t) {  
    mpz_t temp;  
    mpz_init(temp);  
    mpz_add_ui(temp, a, 1UL);  
    mpz_set(a, temp);  
    mpz_clear(temp);  
}

所以,我的问题是这个。将多精度类型作为返回参数和操作数之一传递给 GMP 算术函数是否安全,或者这样做会导致结果损坏?

4

1 回答 1

2

是的,您可以将相同的实例作为输入和输出参数传递。这在文档的“变量约定”部分中明确说明:

GMP 允许您在一次调用中为输入和输出使用相同的变量。例如,整数乘法的主函数 mpz_mul 可用于对 x 求平方并将结果放回 x 中

 mpz_mul (x, x, x);
于 2010-07-18T02:22:12.873 回答