发布网友 发布时间: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追问代码怎么写啊