Floating point 添加32位浮点数。

Floating point 添加32位浮点数。,floating-point,32-bit,floating-point-precision,Floating Point,32 Bit,Floating Point Precision,我学到了比我想知道的更多的关于浮点数的知识 假设我需要补充: 1 10000000000000000000000000000000000 101111000 1111100000000000000000000000000 2的补语形式 第一位是符号,接下来的8位是指数,最后23位是mantisa 如果不转换成科学记数法,我如何将这两个数字相加?你能一步一步走过去吗 这方面有什么好的资源吗?视频和实践例子将是伟大的 您必须缩放数字,使它们具有相同的指数。然后添加尾数字段,如有必要,将结果归一化 哦

我学到了比我想知道的更多的关于浮点数的知识

假设我需要补充:

1 10000000000000000000000000000000000

101111000 1111100000000000000000000000000

2的补语形式

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

如果不转换成科学记数法,我如何将这两个数字相加?你能一步一步走过去吗


这方面有什么好的资源吗?视频和实践例子将是伟大的

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

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

让我们做一个十进制的例子,因为它更容易理解。让我们进一步假设它们存储在小数点右边只有八位数字(数字介于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单精度浮点数将具有:

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;
}
你可以在这里看到,我们有进位的情况,所以我们不能把进位放在数字中,限制在8位。然后我们要做的是将数字向右移动,以便插入进位。因为这个位移实际上是除以10,我们必须增加指数来抵消它

因此:

变成:

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

你能介绍一下怎么做吗?谢谢。另一个问题是,假设尾数中有18453284+93000000。进位会溢出到指数吗?不,如果以进位结束,这是归一化的一部分。您可以将所有尾数数字向右移动,以便插入进位,并将指数增加1。我将添加另一个示例。
sign  exponent  mantissa  value
   1         5 199999998  ???
sign  exponent  mantissa  value
   1         6  20000000  + 0.2 x 10^6