c语言浮点数乘法算法,单精度浮点数乘法的实现

本文详细介绍了如何使用C语言实现单精度浮点数的乘法算法,包括符号位处理、指数计算、尾数运算及规格化等步骤,并提供了程序框图和处理流程。程序能够处理溢出和下溢情况,并与标准C库的浮点数乘法进行了对比验证。
摘要由CSDN通过智能技术生成

按:计算机组成课程第四周作业

算法证明

0818b9ca8b590ca3270a3433284dd417.png

图表 1       浮点数的表示

浮点数的表示如上图所示,我们要做的是将按如上方式存储的两个浮点数相乘,将其结果用如上的方式表示。

符号位只是两者的异或,指数位基本上是两指数的相加,而尾数位就需要在正常的乘法之余考虑到移位(和随之而来的指数为的溢出)和进位的情况。

下面就来讨论一下尾数的运算:

在尾数前补上1,进行无符号数乘法。小数点仅作为算法分析时的记号,实际上不参加运算。用64位的long long类型的数来存储运算结果。

0818b9ca8b590ca3270a3433284dd417.png

图表 2       尾数相乘(用“画图”程序画的)

如上图所示,后46个数字是结果的小数点后的数据,小数点的的问号处可能只有1,可能是1X(10或11,在算法中没有太大区别)。若问号处只有1,说明已经规格化完成;若是1X,需要将整个数右移一位,质数加一,从而使问号处只有1。

规格化后要进行round操作,如下图所示。如果第23位是0,这一位之前的23位就是所需要的尾数。如果第23位是1,截取这位之前的数,加一(类似于四舍五入)。判断结果是否仍规格化。若没有规格化,从规格化开始继续做,直到找到规格化后的23位尾数。

0818b9ca8b590ca3270a3433284dd417.png

图表 3       有效数处理(用“画图”程序画的)

程序框图

主要流程如下图所示。在代码注释中的Step1到step5即分别对应流程图中的1至5部分。有所不同的是,因为后面只会增加exponent而不会减少,所以我的程序在step1就判断是否overflow,在step3也判断是否overflow就行了,规格化完成后再判断underflow。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值