gpt4 book ai didi

我可以计算 double 引入的误差吗?

转载 作者:行者123 更新时间:2023-12-04 05:07:58 27 4
gpt4 key购买 nike

假设我有一个无理数,例如 \sqrt{3}。由于它是无理数,因此没有小数表示。因此,当您尝试使用 IEEE 754 double 来表达它时,您将引入错误。

具有很多数字的十进制表示形式是:

1.7320508075688772935274463415058723669428052538103806280558069794519330169088
00037081146186757248575675...

现在,当我计算 \sqrt{3} 时,我得到 1.732051:

#include <stdio.h> // printf
#include <math.h> // needed for sqrt

int main() {
double myVar = sqrt (3);
printf("as double:\t%f\n", myVar);
}

根据Wolfram|Alpha ,我的错误为 1.11100... × 10^-7

有什么方法可以自己计算误差吗?

(我不介意切换到 C++、Python 或 Java。如果没有简单的替代方案,我可能也可以使用 Mathematica)

只是澄清一下:我不想要一个仅适用于 sqrt{3} 的解决方案。我想要一个函数,它可以给我任何数字的错误。如果不可能,我至少想知道 Wolfram|Alpha 如何获得更多值。

我的尝试

在写这个问题时,我发现了这个:

#include <stdio.h> // printf
#include <math.h> // needed for sqrt
#include <float.h> // needed for higher precision

int main() {
long double r = sqrtl(3.0L);
printf("Precision: %d digits; %.*Lg\n",LDBL_DIG,LDBL_DIG,r);
}

有了这个,我可以根据Wolfram|Alpha将错误降低到2.0 * 10^-18 。所以我认为这可能足够接近,可以很好地估计误差。我写的是:

#include <stdio.h> // printf
#include <math.h> // needed for sqrt
#include <float.h>

int main() {
double myVar = sqrt (3);
long double r = sqrtl(3.0L);
long double error = abs(r-myVar) / r;
printf("Double:\t\t%f\n", myVar);
printf("Precision:\t%d digits; %.*Lg\n",LDBL_DIG,LDBL_DIG,r);
printf("Error:\t\t%.*Lg\n", LDBL_DIG, error);
}

但它输出:

Double:     1.732051
Precision: 18 digits; 1.73205080756887729
Error: 0

如何修复该错误?

最佳答案

每个程序员都应该了解 Goldberg 的《浮点算术》,这就是您正在寻找的明确指南。

https://ece.uwaterloo.ca/~dwharder/NumericalAnalysis/02Numerics/Double/paper.pdf

关于我可以计算 double 引入的误差吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15276219/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com