gpt4 book ai didi

precision - 数字系统中的浮点表示

转载 作者:行者123 更新时间:2023-12-04 01:23:05 26 4
gpt4 key购买 nike

enter image description here

我不知道如何解决这个问题,我知道浮点数的显式、隐式和 IEEE-754 规范化表示,但如何将其分解为小问题。请帮我想象一下。

最佳答案

让我们假设 IEEE-754 单精度浮点数。在这样一个浮点数中,你有大约 7 位的精度——之后你就进入了浮点荒野。
我是什么意思?好吧,假设我有一个数字 = 7654321。我可以将其转换为 32 位浮点值,然后我可以取回确切的数字。当数字变得比这个大时,我开始失去精度 - 即数字从我的浮点数的末尾脱落并丢失。
考虑以下:

#include <stdio.h>

int main(int argc, char *argv[])
{
float f1 = 7654321, f2 = 987654321;

printf("f1 = %f f2 = %f\n", f1, f2);
}
当我运行这个时,我得到
f1 = 7654321.000000   f2 = 987654336.000000
希望你看到并说,“说什么?!?!”。发生了什么 f2 ?
正如我所说,32 位浮点数只有大约 7(十进制)位的精度。如果您尝试将超过 7 位精度的数字放入 32 点浮点变量中,则会失去精度 - 低位数字会丢失。
因此,让我们考虑问题中的值:
A =  2.0 * 10^30
B = -2.0 * 10^30
C = 1.0
你应该弄清楚你在执行计算时得到了什么
X = A + B
X = X + C
Y = A + C
Y = Y + B
好吧,让我们从第一个开始。代入我们得到的值
X = A + B = (2.0 * 10^30) + (-2.0 * 10^30)
运气好的话 X 现在将为零。然后我们有
X = X + C
所以,代入我们得到的值
X = 0.0 + 1.0
所以 X 应该以 1.0 结束。
好吧,那很有趣。现在让我们看一下 Y 计算,它们与 X 计算实际上相同,只是重新排列了一下:
Y = 2.0 * 10^30 + 1.0
这应该给我们结果 2.0 * 10^30 .嗯?为什么?!?那么, 2*10^30超过了浮点数的可能精度(只能保留 7 位精度),因为它表示 30 位数字,因此加上值 1.0到 2*10^30 不改变它 .所以此时 Y = 2.0 * 10^30 .然后我们添加 B = -2.0 * 10^30到它,我们得到 - 是的,零。
所以你最终得到 X = 1.0, Y = 0.0,即使你在头脑中执行这些计算而不考虑计算机中浮点数的精度限制,你会得到它们两个的值 1.0。
这里的预期教训是,当您处理浮点值时,运算顺序非常重要,您必须仔细考虑正在处理的值的大小来计划计算,以免结束加上数字糊状物。
顺便说一句,这里有一个小程序来实现你的任务:
#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
float A = 2.0 * pow(10, 30), B = -2.0 * pow(10, 30), C = 1.0;
float X, Y;

X = A + B;
X = X + C;

Y = A + C;
Y = Y + B;

printf("X = %f Y = %f\n", X, Y);
}
运行它并打印
  X = 1.000000   Y = 0.000000
Online GDB here

关于precision - 数字系统中的浮点表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62319101/

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