汇编语言:如何将浮点数转换为二进制 20

从键盘上输入一个浮点数(考虑单精度、双精度、扩展精度的情况)转换为二进制数,并保存在内存当中用MASM编写,怎样设计这个函数... 从键盘上输入一个浮点数(考虑单精度、双精度、扩展精度的情况)转换为二进制数,并保存在内存当中
用MASM编写,怎样设计这个函数
展开
 我来答
bysdxt
2012-05-10 · TA获得超过443个赞
知道小有建树答主
回答量:323
采纳率:0%
帮助的人:247万
展开全部
你说从键盘上输入,那输入应该是一个字符串,例如 "1.23" 之类的
如果像1楼那样自己实现IEEE标准的话是很麻烦的,因为要用到高精度算法。
如果没要求自己实现浮点数标准(符号位、幂、尾数)的话,因为现在PC机的CPU基本都是用那个标准,所以我建议叫CPU来完成转化。
下面例子为了方便用C语言表示
例如输入是字符串 str = "123.456"
double value = 0; // 初始化双精度数value为0
依次扫描字符串 str = "123.456"
小数点前面的整数是 "123"
value = value * 10 + (str[0] - '0');
value = value * 10 + (str[1] - '0');
value = value * 10 + (str[2] - '0');
现在 value = 123
小数点后数就另外一种处理方法
double p = 1;
value += (str[4] - '0') * (p /= 10);
value += (str[5] - '0') * (p /= 10);
value += (str[6] - '0') * (p /= 10);
这样 value 基本上等于 123.456.
为什么说基本上,因为中间用了除法,可能导致精度丢失。
或者你可以先让 value = 123456,然后 value 除以 1000,那样精度高一些。
这个过程其实是字符串转为浮点数的过程,像C里的 scanf 函数。
value 在计算机里就是按照IEEE标准存放的了
匿名用户
2012-04-29
展开全部
IEEE浮点数规则,分符号位S,阶码E,尾数M。

长度float=S+E+M=1+8+23=32, double=1+11+52=64.

符号位0表示正,1表示负。

阶码可表达位移量,比如S=8, (2^8/2=256/2=128) ,可表达(127,-128),因为正数包含零所以是127. 为了不出现负数所以指数数值要加上127,数值左移为负,右移为正。

尾数即是位移后的数值。

Float 38414.4 二进制表示:

第一阶段:

38414.4 = 960E.66

= 1001_0110_0000_1110.0110_0110

计算如下:

38414/16=2400...14

2400/16=150...0

150/16=9...6

38414 = 9_6_0_E =9*16^(3)+6*16^(2)+0*16^(1)+E*16^(0)

9/2=4...1

4/2=2...0

2/2=1...0

9 = 1_0_0_1 = 1*2^(3)+0*2^(2)+0*2^(1)+1*2(0)

以此类推,我这样计算的目的是顺便介绍十六进制的转换方法。

0.4*16=6.4=6...0.4

0.4*16=6.4=6...0.4

...

0.4=0.66...=6*16^(-1)+6*16^(-2)...

或者

6/2=3...0

3/2=1...1

6=1_1_0

补齐四位

6=0_1_1_0

0.4=0.66...=0.0110_0110_...

0.4*2=0.8=0...0.8

0.8*2=1.6=1...0.6

0.6*2=1.2=1...0.2

0.2*2=0.4=0...0.4

...

0.4=0.0110...=0*2^(-1)+1*2^(-2)+1*2^(-3)+0*2^(-4)...

第二阶段:

将1001_0110_0000_1110.0110_0110 右移到头上为1,即右移了15位,相当于除以了2^15得到:

1.001_0110_0000_1110_0110_0110

M=001_0110_0000_1110_0110_0110

E=127+15=142=8E=1000_1110

计算如下:

142/16=8...14

=8E

8/2=4...0

4/2=2...0

2/2=1...0

=1000

14/2=7...0

7/2=3...1

3/2=1...1

=1110

142=8E=1000_1110

第三阶段:

因为是正数 S=0

float 38414.4

=0_1000_1110_001_0110_0000_1110_0110_0110

=1.001_0110_0000_1110_0110_0110 * 2^( 1000_1110 – 0111_1111 )

=1.001_0110_0000_1110_0110_0110 * 2^( 0000_1111 )

计算如下:

1000_1110 – 0111_1111

=0111_2222-0111_1111

=0000_1111

=1001_0110_0000_1110.0110_0110

=9_6_0_E.6_6

=38414.3984
追问
代码怎么写啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式