gpt4 book ai didi

c - long double的浮点错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:19 25 4
gpt4 key购买 nike

如果用 C 编写一个程序来感受一下重复除法时浮点误差的大小。

#include <stdio.h>

int main (int argc, char* argv[]) {
if (argc < 3) {
printf("Enter a decimal number as the first positional "
"argument\n");
printf("Enter the maximum number of digits to print as the "
"second positional argument\n");
return 0;
}

long double d;
sscanf(argv[1], "%Lf", &d);
int m;
sscanf(argv[2], "%d", &m);

int i;
char format[10];
for (i = 1; i <= m; ++i) {
printf("(%d digits)\n", i);
sprintf(format, "%%.%dLf\n\n", i);
printf(format, d);
}

long double p = d;
printf("\n");
for (i = 1; i <= m; ++i) {
printf("(%Lf/10e%d with %d digits)\n", d, i, m);
p = p/(long double)10.0;
printf(format, p);
}
return 0;
}

这是使用以下参数运行时的一行输出

$ fpe 0.1 700
.
.
.
(0.100000/10e180 with 700 digits)
0.0000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000999999999999999999969819570700939858153376
736698732853283605408116087882762948991724868957176649769045358705872354052
261113540314114885779914335315639806061208847920179776799404948795506248532
485303630811119507604985596684233990126219304092175565232198569923253737561
276484626462077772036038845251286782974821021132356946292172207615386395848
331484216638642723800290357587296443408362280895970909637712494349003491485
594533190659822910753768473307578901199121901299804449081420898437500000000
000000000000000000000000000
.
.
.

在这里,我们观察到 485 位浮点噪声。这是用 gcc 4.4.3 编译的,我假设它使用 80 位扩展精度。然而,485 个十进制数字远远超过 80 位信息。那么,我的问题是,这些信息来自哪里?

最佳答案

没有打印额外的信息。打印出来的值就是p的值。

经过180次迭代后,p为+0x1.A8E90F9908E0CA56p-602,即15309010345804195115•2-665。 IEEE 754 标准定义 float 的值是一个符号(+1 或 −1)乘以 2 的整数次幂(由数字的指数字段确定)乘以其有效数字(小数部分)的值。所以每个 float 都有一个特定的值。以上是p的值。 In decimal, that value is exactly .9999999999999999999698195707009398581533767366987328532836054081160878827629489917248689571766497690453587058723540522611135403141148857799143353156398060612088479201797767994049487955062485324853036308111195076049855966842339901262193040921755652321985699232537375612764846264620777720360388452512867829748210211323569462921722076153863958483314842166386427238002903575872964434083622808959709096377124943490034914855945331906598229107537684733075789011991219012998044490814208984375•10-181.

那是你的程序产生的值(value)。因此,您的输出格式化程序已准确打印出 p 的值。它做得很好。

事实上,从各方面来看, float 都做得很好。该值是最接近 10-181 的 long double 值。在长双人中不可能更接近。因此,即使经过数百次算术运算,错误也没有增加。

这里没有新信息。如果我们被告知 p 的表示中的位,我们可以产生相同的数百位十进制数字。他们没有告诉你任何新东西。但是,它们也不是垃圾;它们完全由 p 的值决定。

关于c - long double的浮点错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13774172/

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