我正在尝试使用GMP在C(而不是Python)中实现this算法。他们的Python代码很短;但是,C实现要长得多,因为我们无法进行GMPY的支持。
#include <stdio.h>
#include <stdlib.h>
#include <gmp.h>
void f_mod(mpq_t input) {
mpf_t numerator;
mpf_init(numerator);
mpf_set_z(numerator, mpq_numref(input));
mpf_t denominator;
mpf_init(denominator);
mpf_set_z(denominator, mpq_denref(input));
mpf_t div;
mpf_init(div);
mpf_t integer_part;
mpf_init(integer_part);
// Integer component
mpq_t floored;
mpq_init(floored);
mpf_div(div, numerator, denominator);
mpf_floor(integer_part, div);
mpq_set_f(floored, integer_part);
// Get fractional part
mpq_sub(input, input, floored);
}
int main() {
unsigned long end_val = 1000;
mpq_t x;
mpq_init(x);
mpq_set_ui(x, 0, 1);
mpq_t p;
mpq_init(p);
mpq_t res;
mpq_init(res);
mpq_t sixteen;
mpq_init(sixteen);
mpq_set_ui(sixteen, 16, 1);
unsigned long n = 1;
printf("\n");
short* results = (short*) malloc(end_val * sizeof(short));
while (n < end_val)
{
mpq_set_ui(p, (120*n-89)*n+16, (((512*n-1024)*n+712)*n-206)*n+21);
mpq_mul(res, x, sixteen);
mpq_add(res, res, p);
f_mod(res);
mpq_set(x, res);
mpq_mul(res, res, sixteen);
results[n] = (short) mpq_get_d(res);
n++;
}
char* buffer = (char*) malloc(sizeof(char));
for (unsigned long a = 0; a < end_val; a++)
{
snprintf(buffer, 16, "%x", results[a]);
printf("%s", buffer);
}
return 0;
}
3.243F6A8885A308D313198A后输出变得不正确......发生了什么事?
编辑:我更改了f_mod()方法,因此它减去了两个mpq而不是mpfs。这提高了准确度,但仍然不够。编辑2:我尝试在我的其他电脑上运行这个程序,它神奇地工作了!除了我写的笔记本电脑是32位以及它工作的桌面是64位之外,我不确定有什么不同。它也可能是GMP实现中的一个错误(Debian Wheezy中打包的版本)。但是,我确实怀疑顺序BBP公式有问题。我想我会尝试重新推导它。
答案 0 :(得分:1)
这一行看起来很可能是罪魁祸首:
char* buffer = (char*) malloc(sizeof(char));
这里只为单个字符分配空间。