C MPFR库计算精度的工作原理
我承认我在理解C MPFR库计算精度的工作原理,c,gmp,mpfr,C,Gmp,Mpfr,我承认我在理解MPFR库时遇到困难,我试图计算一个大数字的平方根,但我不确定如何定义mpft\u t根变量的精度,或者什么是最佳的四舍五入方法 我的代码如下: #包括 #包括 #包括 int main(){ mpfr\t bigNumber,bigNumber2,root2; 无符号长整型大小=1000000; mpfr_init2(大数字、大小); mpfr_init2(bigNumber2,大小); mpfr_init2(root2,size); mpfr_ui_pow_ui(大数字,82
MPFR
库时遇到困难,我试图计算一个大数字的平方根,但我不确定如何定义mpft\u t根
变量的精度,或者什么是最佳的四舍五入方法
我的代码如下:
#包括
#包括
#包括
int main(){
mpfr\t bigNumber,bigNumber2,root2;
无符号长整型大小=1000000;
mpfr_init2(大数字、大小);
mpfr_init2(bigNumber2,大小);
mpfr_init2(root2,size);
mpfr_ui_pow_ui(大数字,82000,mpfr_RNDZ);
mpfr_sqrt(root2,bigNumber,mpfr_RNDA);
mpfr\u pow\u ui(bigNumber2,root2,2,mpfr\u RNDA);
返回0;
}
但是,不管为mpz\u t root
设置的精度如何,结果通常都不令人满意
mpfr\u pow\u ui(bigNumber2,root,2,mpfr\u RNDA)
的结果通常不同于mpfr\u bigNumber
,我指的不是浮点值,而是整个部分
如何确定执行特定计算所需的精度
此计算的最佳舍入形式是什么
为什么会出现这种不准确的情况?代码运行良好(在GCC 9.3.0和MPFR 4.1.0上),并返回原始数字
#include <stdio.h>
#include <stdlib.h>
#include <mpfr.h>
int main()
{
mpfr_t bigNumber, bigNumber2, root2;
unsigned long int size = 100000;
mpfr_init2(bigNumber, size);
mpfr_init2(bigNumber2, size);
mpfr_init2(root2, size);
mpfr_ui_pow_ui(bigNumber, 8, 20000, MPFR_RNDD);
mpfr_out_str (stdout, 10, 0, bigNumber, MPFR_RNDD);
putchar ('\n');
putchar ('\n');
putchar ('\n');
mpfr_sqrt(root2, bigNumber, MPFR_RNDD);
mpfr_out_str (stdout, 10, 0, root2, MPFR_RNDD);
putchar ('\n');
putchar ('\n');
putchar ('\n');
mpfr_pow_ui(bigNumber2, root2, 2, MPFR_RNDD);
mpfr_out_str (stdout, 10, 0, bigNumber2, MPFR_RNDD);
putchar ('\n');
putchar ('\n');
putchar ('\n');
putchar ('\n');
return 0;
}
#包括
#包括
#包括
int main()
{
mpfr\t bigNumber,bigNumber2,root2;
无符号长整型大小=100000;
mpfr_init2(大数字、大小);
mpfr_init2(bigNumber2,大小);
mpfr_init2(root2,size);
mpfr\u ui\u pow\u ui(大数字,82000,mpfr\u RNDD);
mpfr\u out\u str(标准输出、10、0、大数字、mpfr\u RNDD);
putchar('\n');
putchar('\n');
putchar('\n');
mpfr_sqrt(root2,bigNumber,mpfr_RNDD);
mpfr_out_str(标准值,10,0,根2,mpfr_RNDD);
putchar('\n');
putchar('\n');
putchar('\n');
mpfr\u pow\u ui(bigNumber2,root2,2,mpfr\u RNDD);
mpfr\u out\u str(标准值,10,0,bigNumber2,mpfr\u RNDD);
putchar('\n');
putchar('\n');
putchar('\n');
putchar('\n');
返回0;
}
我们需要一个,请。好的,我更正了这个问题。我与MPFR合作已经有一段时间了,所以我不确定您的代码在精度上要求它的确切程度,但我怀疑您对bigNumber2
和root2
使用相同的精度。在这种情况下,考虑到一些精度,使得ULP相对于p是大约p的一部分,如果我们有一些具有平方根x的y,则所计算的平方根可以是x×1 /(2p),因为需要舍入,然后平方是x^ 2 +2x/(2p)+1(/ 4p^ 2),它大约是y+x/p。因此,计算sqrt(y)^2
与y
不同并不意外。换句话说,平方根的较小相对误差会导致平方根的较大相对误差。你必须以比平方更高的精度来计算平方根,以便在大多数情况下恢复原始数字,即使如此,我怀疑可能会有一些情况失败。你为什么要让一个平方根的平方等于原来的数字呢?浮点运算通常是一种近似运算;你们不应该期望得到和实数数学相同的结果。这只是为了学习。在这种情况下,我只是在研究图书馆的准确性。谢谢你的解释。