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

发布网友 发布时间:2022-04-20 03:17

我来回答

2个回答

热心网友 时间:2023-07-01 05:32

你说从键盘上输入,那输入应该是一个字符串,例如 "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标准存放的了

热心网友 时间:2023-07-01 05:32

IEEE浮点数规则,分符号位S,阶码E,尾数M。

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

符号位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追问代码怎么写啊

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
16.019758s