C语言——浮点数加法

Description  

求2个浮点数相加的和。 
题目中输入输出中出现浮点数都有如下的形式: 
P1P2...Pi.Q1Q2...Qj 
对于整数部分,P1P2...Pi是一个非负整数。 
对于小数部分,Qj不等于0。

Input  

第1行是测试数据的组数n,每组测试数据占2行,分别是两个加数。每组测试数据之间有一个空行,每行数据不超过100个字符。

Output  

 n行,每组测试数据有一行输出是相应的和。由输入保证输出一定是一个小数部分不为0的浮点数,即由输入保证输出结果至少有一位小数。

Sample Input  


2
0.111111111111111111111111111111
0.111111111111111111111111111111

10000000.655555555555555555555555555555
1.444444444444444444444444444445


Sample Output  


0.222222222222222222222222222222
10000002.1
 

 

#include<stdio.h>
#include<string.h>

int main(){
	int n;
	int i,j,k,t=0;
	int alen,blen;
	char a[150],b[150];
	int a1[150]={0},b1[150]={0},a2[150]={0},b2[150]={0},ans1[150]={0},ans2[150]={0};
	scanf("%d",&n);
	while(n--){
		scanf("%s",&a);
		scanf("%s",&b);
		alen=strlen(a);
		blen=strlen(b);
		for(i=0;i<150;i++){
			a1[i]=0;
			a2[i]=0;
			b1[i]=0;
			b2[i]=0;
			ans1[i]=0;
			ans2[i]=0;
		}

		for(i=0;i<alen;i++){
			if(a[i]=='.'){
				k=0;
				for(j=i-1;j>=0;j--){
					a1[k++]=a[j]-'0';
				}
				k=0;
				for(j=i+1;j<alen;j++){
					a2[++k]=a[j]-'0';
				}
			}
		}
		for(i=0;i<blen;i++){
			if(b[i]=='.'){
				k=0;
				for(j=i-1;j>=0;j--){
					b1[k++]=b[j]-'0';
				}
				k=0;
				for(j=i+1;j<blen;j++){
					b2[++k]=b[j]-'0';
				}
			}
		}
		for(i=140;i>0;i--){
			ans1[i]+=a2[i]+b2[i];
			if(ans1[i]>=10){
			    ans1[i-1]+=1;
				ans1[i]-=10;;
			}
		}
		if (ans1[0]!=0) a1[0]=a1[0]+1;

		for(i=0;i<=140;i++){
			ans2[i]+=a1[i]+b1[i];
			if(ans2[i]>=10){
				ans2[i]%=10;
				ans2[i+1]+=1;
			}
		}
		for(i=140;i>=0;i--){
			if(ans2[i]!=0){
				for(j=i;j>=0;j--){
					printf("%d",ans2[j]);
				}
				break;
			}
		}
		if(i==-1) printf("0");
		printf(".");
		for(i=140;i>0;i--){
			if(ans1[i]!=0){
				for(j=1;j<=i;j++){
			printf("%d",ans1[j]);
				}
				break;
			}
		}
		if(i==0) printf("0");
		printf("\n");
	}
}

 

### IEEE754浮点数加法计算原理 #### 1. IEEE754协议概述 IEEE754标准定义了一种用于表示浮点数及其运算的标准方式。该标准支持多种数据类型,其中最常见的是单精度(32位)和双精度(64位)。对于单精度浮点数而言,其结构由三部分组成:符号位(S)、指数位(E,8位)以及尾数位(M,23位),具体格式如下: | 符号位 (S) | 指数位 (E) | 尾数位 (M) | |------------|-------------|-------------| | 1 bit | 8 bits | 23 bits | 这种格式允许精确表达非常大或非常小的数值。 #### 2. 浮点数加法的核心步骤 基于IEEE754标准的浮点数加法通常遵循以下几个核心逻辑环节[^3]: - **对阶操作** 需要将两个参与运算的浮点数调整到相同的指数级别。这一步通过比较两者的指数大小并使较小的那个向较大的靠齐来完成。 - **尾数相加** 完成对阶之后,可以简单地把经过处理后的尾数按照整数的方式相加以得到初步的结果。 - **规格化处理** 如果上述过程中产生了溢出,则需重新进行一次左移或者右移动作使得最终结果满足规范化的要求;如果存在隐含的一位最高有效数字为零的情况也需要相应调整。 - **舍入与截断** 考虑有限存储空间的影响,在某些情况下可能还需要执行四舍五入或者其他形式的数据缩减措施以适应硬件资源限制条件下的保存需求。 #### 3. 示例解析——如何手动计算 `100.25 + 0.25` 的IEEE754浮点数加法? 以下是详细的分步说明: ##### (1)转换十进制数至二进制科学计数法表示 先分别将100.25 和 0.25转写成二进制形式,并进一步改写成标准化的二进制科学记数法: \[ 100_{(10)} = 1100100_{(2)}, \quad 0.25_{(10)} = 0.01_{(2)}. \] 接着统一写出它们各自的规范化的二进制科学记数法版本: \[ 100.25_{(10)} = 1.100100_2 \times 2^{6}, \] \[ 0.25_{(10)} = 1.0_2 \times 2^{-2}. \][^1] ##### (2)实施对阶动作 由于第一个数的有效指数较大 (\(+6\)) ,第二个数则相对较低 (-2),因此我们应当提升后者直至两者一致为止。即让 \(1.0_2\) 向高位扩展直到达到相同幂次的位置上: \[ 1.0_2 \times 2^{-2} → 0.000001_2 \times 2^{6}\] 此时新的被加项变为\(0.000001_2×2⁶\)。 ##### (3)实际累加尾数部分 现在可以直接加上去之前准备好的那个已经完成了适当缩放过的第二份材料了: \[ 1.100100_2 + 0.000001_2 = 1.100101_2.\] 注意这里并没有超出范围也没有丢失任何重要的信息成分因为所有的变动都严格控制在合理界限以内。 ##### (4)最后再做必要的规约工作 确认所得总合仍然保持在一个有效的范围内而且没有任何多余的冗余比特残留下来即可结束整个流程获得最终答案啦! #### 4. C语言实现示例 下面给出一段利用C编程语言模拟这一过程的例子程序片段: ```c #include<stdio.h> float add_ieee(float a,float b){ float result; asm ("addss %1, %2;" : "=x"(result):"x"(a),"x"(b)); return result; } int main(){ float num1=100.25,num2=0.25,sum; sum=add_ieee(num1,num2); printf("Sum of %.2f and %.2f is %.2f\n",num1,num2,sum); return 0; } ``` 此代码片断展示了怎样借助汇编指令调用来达成更底层级别的控制从而更加贴近真实的处理器内部工作机制来进行这样的基本算术运算活动。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值