Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C MPFR库计算精度的工作原理_C_Gmp_Mpfr - Fatal编程技术网

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
不同并不意外。换句话说,平方根的较小相对误差会导致平方根的较大相对误差。你必须以比平方更高的精度来计算平方根,以便在大多数情况下恢复原始数字,即使如此,我怀疑可能会有一些情况失败。你为什么要让一个平方根的平方等于原来的数字呢?浮点运算通常是一种近似运算;你们不应该期望得到和实数数学相同的结果。这只是为了学习。在这种情况下,我只是在研究图书馆的准确性。谢谢你的解释。