Floating point 添加32位浮点数。
我学到了比我想知道的更多的关于浮点数的知识 假设我需要补充: 1 10000000000000000000000000000000000 101111000 1111100000000000000000000000000 2的补语形式 第一位是符号,接下来的8位是指数,最后23位是mantisa 如果不转换成科学记数法,我如何将这两个数字相加?你能一步一步走过去吗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 如果不转换成科学记数法,我如何将这两个数字相加?你能一步一步走过去吗 这方面有什么好的资源吗?视频和实践例子将是伟大的 您必须缩放数字,使它们具有相同的指数。然后添加尾数字段,如有必要,将结果归一化 哦
这方面有什么好的资源吗?视频和实践例子将是伟大的 您必须缩放数字,使它们具有相同的指数。然后添加尾数字段,如有必要,将结果归一化 哦,是的,如果它们是不同的符号,您只需调用减法函数即可:-) 让我们做一个十进制的例子,因为它更容易理解。让我们进一步假设它们存储在小数点右边只有八位数字(数字介于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