gpt4 book ai didi

floating-point - 添加 32 位 float 。

转载 作者:行者123 更新时间:2023-12-04 06:46:18 25 4
gpt4 key购买 nike

我学到的比我想知道的更多关于 float 的知识。

假设我需要添加:

1 10000000 00000000000000000000000

1 01111000 11111000000000000000000

2 的补码形式。

第一位是符号,接下来的 8 位是指数,最后 23 位是尾数。

在不转换为科学计数法的情况下,如何将这两个数字相加?你能一步一步走过去吗?

这东西有什么好的资源吗?视频和练习示例会很棒。

最佳答案

您必须缩放数字,使它们具有相同的指数。然后添加尾数字段,如有必要,对结果进行归一化。

哦,是的,如果它们的符号不同,您只需调用减法函数即可:-)

让我们用十进制做一个例子,因为它更容易理解。让我们进一步假设它们只存储小数点右边的八位数字(并且数字介于 0 和 1 之间)。

将两个数字相加:

sign  exponent  mantissa  value
1 42 18453284 + 0.18453284 x 10^42
1 38 17654321 + 0.17654321 x 10^38

将这些数字缩放到最高指数给出了一些可以添加尾数字段的地方。:

sign  exponent  mantissa  value
1 42 18453284 + 0.18453284 x 10^42
1 42 1765 + 0.00001765 x 10^42
= == ========
1 42 18455049 + 0.18455049 x 10^42

这就是您的电话号码。这也说明了如何由于移位而损失准确性。例如,IEEE754 单精度 float 将具有:

1e38 + 1e-38 = 1e38

例如:

#include <stdio.h>
int main (void) {
float f1 = 1e38;
float f2 = 1e-38;
float f3 = f1 + f2;
float f4 = f1 - f3;
printf ("%.50f\n", f4);
return 0;
}

就溢出发生的情况而言,这是我提到的规范化的一部分。让我们将 99999.9999 添加到 99999.9993。由于它们已经具有相同的指数,因此无需缩放,因此我们只需添加:

sign  exponent  mantissa  value
1 5 99999999 + 0.99999999 x 10^5
1 5 99999993 + 0.99999999 x 10^5
= == ========
1 5 199999992 ???

您可以在这里看到我们有进位情况,因此我们不能将进位放入数字中,因为它被限制为八位数字。然后我们要做的是将数字向右移动,以便我们可以插入进位。由于这种转变实际上是除以十,我们必须增加指数来抵消这一点。

所以:

sign  exponent  mantissa  value
1 5 199999992 ???

变成:

sign  exponent  mantissa  value
1 6 19999999 + 0.19999999 x 10^6

实际上,这不仅仅是简单的右移,因为您需要四舍五入到最接近的数字。如果你移出的数字是五或更多,你需要在左边的数字上加一。这就是我选择 99999.9993 作为第二个数字的原因。如果我将 99999.9999 添加到自身,我将得到:

sign  exponent  mantissa  value
1 5 199999998 ???

在右移时,会触发相当多的向左进位:

sign  exponent  mantissa  value
1 6 20000000 + 0.2 x 10^6

关于floating-point - 添加 32 位 float 。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884343/

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