gpt4 book ai didi

c - 大 float 和的精度2

转载 作者:行者123 更新时间:2023-11-30 18:34:55 24 4
gpt4 key购买 nike

我读过,当将大量的浮点加起来时,最好的方法是从最低到最高相加。我编写了一个代码,完全做到了这一点,但是从最高到最低的总和更精确了,我不明白为什么,我问它here。我接受了一个回答,说这是因为本地数组是在空间有限的堆栈上创建的。答案中的这段代码未使用任何数组,因此更为精确:

#include <stdio.h>

int main() {

double pi2over6 = 1.644934066848226;
double sum = 0.0, sum2 = 0.0;
double y;
int i, n;

printf("Enter number of iterations:\n");
scanf("%d", &n);

y = 1.0;

for (i = 0; i < n; i++) {
sum += 1.0 / (y * y);
y += 1.0;
}

for (i = 0; i < n; i++) {
y -= 1.0;
sum2 += 1.0 / (y * y);
}
printf("sum from biggest to smallest is %.16f\n", sum);
printf("and its error %.16f\n", pi2over6 - sum);
printf("sum from smallest to biggest is %.16f\n", sum2);
printf("and its error %.16f\n", pi2over6 - sum2);
return 0;


是的,当输入为1000000000时,它的精确度要高得多,例如,如果输入为 1000,我仍然遇到相同的问题。为什么?

最佳答案

从最低到最高计算的总和更准确;它与精确结果的差约为1 ULP,而从最高到最低计算的总和相差约7 ULP。

将1000个项的和与无限和相比较是错误的。前1000个项的精确数学和与无限和之间的差远远大于在计算前一个和时出现的误差。 1000个项的三个和(精确的数学,从最低到最高,从最高到最低)彼此之间在8个ULP之内,而无限级数的总和要高4.5万亿个ULP。

(此外,对π2/ 6的估计是不准确的。您的程序具有1.644934066848226。在IEEE 754基本64位二进制浮点数(我将用于此答案)中,该数值精确到1.6449340668482259619764818125986494123935699462890625。但是,1.6449340668482264060060916626612655818462371826171875更近π2/ 6。)

前1000个术语的确切数学总和接近1.6439345666815598031390580238222155896521034464937。使用Maple以扩展的精度进行计算。最接近的可表示值为1.6439345666815599056320706949918530881404876708984375。我将其称为最佳总和,因为它是任何计算出的总和都可能最接近精确的数学值,因为没有可表示的值更接近。

从最高值到最低值的总和是1.643934566681561459944305170211009681224822998046875。这与1.5543122344752191191565930843353271484375e-15的最佳总和不同,即7 ULP。 (ULP是可向上调整可表示值的最小数量;它是可表示值的步长。ULP是数的大小的函数;对于较大的数,它更大。) 7 ULP表示该数字与最佳和有7步之遥。

从最低到最高的总和是1.643934566681559683587465769960545003414154052734375。这与最佳总和-2.220446049250313080847263336181640625e-16不同,后者在另一个方向上为1 ULP(低于最佳总和)。

因此,从最低到最高计算的总和更加准确。

无限总和高出4.5万亿美元。

因此,相对于最佳总和,数字顺序如下:


从最低到最高计算的总和为-1 ULP。
最佳总和是参考点,为0 ULP。
从最高到最低计算得出的总和为+7 ULP。
π2/ 6为4.5万亿ULP。


现在很明显,从最低到最高计算的总和离π2/ 6更远,因为它在最佳总和的另一侧。但这接近最佳金额。

无论如何,没有绝对的规则可以计算出从最低项到最高项的总和会产生最佳答案。这是一个通用准则,基于这样的观念,即误差较小而数量较小。

每次在浮点中添加两个数字时,都会出现一个小错误,因为精确的数学结果必须四舍五入为可表示的值。误差始终是结果的最大1/2 ULP(因为,如果可表示的值与精确的数学结果相比大于½ULP,则在正确方向上的下一个可表示的值将接近½ULP)。

但是,误差可以在0到1/2 ULP之间变化,也可以是正值或负值。假设您添加了一系列随机数。在将数字从最高到最低相加时,我们可能会遇到正误差和负误差的混合,它们恰好在很大程度上抵消了,从而最终产生了接近精确数学结果的最终结果。同时,从最低到最高的数字加法可能会遇到很多正错误,从而累积为一个大错误。

从最低幅度到最高幅度加相同符号的数字往往会产生更好的结果,但这不是绝对的规则。

同样,如果数字是混合符号,则选择添加哪些数字以使运行总和保持接近零可能是有利的,而不是始终选择最低幅度的下一个数字。

关于c - 大 float 和的精度2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214606/

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