我遇到一个问题,我需要准备好探索比未经证实的长长度可以表示的更大范围的数字(范围由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算术函数是否安全,否则会导致结果损坏?
答案 0 :(得分:2)
是的,您可以将相同的实例作为输入和输出参数传递。这在文档的“Variable Conventions”部分明确说明:
GMP允许您使用相同的变量 一次通话中的输入和输出。对于 例如,整数的主要功能 乘法,mpz_mul,可以使用 平方x并将结果放回去 x带
mpz_mul (x, x, x);