首页 > 编程知识 正文

浮点数加减法运算的步骤,浮点数的科学计数法

时间:2023-05-05 22:30:33 阅读:153699 作者:1185

32位浮点数的计算机内部表示由IEEE754标准定义,有很多参考文献。

简单地说,由1位符号位、8位指数位(层编号)、23位小数部分共同定义。 如果想查看浮点数4个字节的二进制表示的详细信息,请在本网站上练习。

33559 www.h-Schmidt.net/float converter/IEEE 754.html

IEEE754标准仅定义了32位(float )和64位)浮点表示法,而且似乎还有扩展的16位和128位浮点表示法,但使用最多的是32位和64位浮点表示法。

IEEE754标准实际上相当复杂,小数部分可能隐含1.0 (标准化小数),也可能不标准化小数。 阶数代码加上偏移,表示无限大,NaN这个特殊的值必须使数字0的所有内部表示为0。

8位浮点表示法没有相关的规范,有MiniFloat,但和我们的教科书不太一样。

这里简化了8位浮点数的定义。

1 )此处的符号位为最高有效位。 0为正,1为负

2 )指数位数、订单代码、三位数、需要减去4才能表示-4到3的范围。 也就是说,000表示- 4,111表示3。 请注意,它与IEEE754标准不同

3 )小数点以下的位数,4位(根据IEEE754的规范,隐藏着1.0

为了尝试这些浮点数,我写了C#程序:

///summary///8位浮点数为//----------------- b6b5b4| b3b1b0------------/符号比//符号位,0为正,1为负的公共输入e; //- 4,3 )公共intm; //[ 0,15 ] publicminifloat (ints,int e,int m ) { this.sign=s; this.e=e; this.m=m; }publicminifloat(intbinary ) this.sign=) binary0x80 ) 7; this.e=(binary0x70 )4)- 4; //3位订单号,表示范围为0到7,减去4,范围为-4到3 this.m=binary0x0F; //低位4位(} public double GetValue () ) return ) sign==0? 1 : -1 ) compmantissa(m ) math.pow ) 2,e ); } publicoverridestringtostring ((strings=string.format ),指数部)1),小数部)2),二进制表示({3},getvostring } reture } publicstringgetdetails ((stringbuilder sb=new stringbuilder ); sb.AppendLine (数值: ' GetValue ) ); sb.AppendLine ('二进制表示:“BinaryString”) ) sb.AppendLine ('小数部分(二进制) ((int ) default _ mantissa ' . ' convecon double manti=mini float.comp mantissa (this.m ); sb.AppendLine ('小数部分(十进制):' manti ); sb.AppendLine ('步骤代码: ' this.e ); sb.appendline(getvalue (()='manti'* )2^'this.e ' ); return sb.ToString (; } publicstringbinarystring ((return convert.tostring ) ) sign7| ) (0x7)4)| m,2 ).PadLeft(8),8,'0' ); } staticpublicdoublecompmantissa (int bits ) double ) ) v={ 0.5、0.25、0.125、0.0625 }; double mantissa=default _ mantissa; //IEEE754中小数部分都是从1.0到for(intI=0; i v.Length; I ) if((bits0x08 )!=0) { mantissa =v[i]; (} bits=bits 1; } return mantissa; }上面是结构体。 主程序尝试一些浮点数的8位表示的细节。

staticvoidmain(string[]args ) double [ ] arr={ 6.25、7、2.5、0.1875、0.1、0.0 }; foreach(doublefinarr ) minifloata=tryminifloat ) f; if(math.ABS ) a.getvalue(-f ) 1.0e-8 { console.writeline ('! !' 不能正确地表达f '; } console.writeline (a.get details ) ); } Console.ReadLine (; } staticminifloattryminifloat (doublef ) { double eps=999.0; MiniFloat mini=new MiniFloat { }; for(intI=0; i 256; I ) minifloattemp=newminifloat(I; double approx=temp.GetValue (; if(math.ABS(approx-f ) eps ) EPS=math.ABS (approx-f ); mini=temp; } } return mini; }可以看出,这种表示方法无法准确表示0.1。

最接近0.1的数是0.1015625

二进制显示: 00001010

小数部分(二进制) 1.1010

小数部分(十进制) 1.625

步骤编号:-4

0.1015625=1.625 * (2 ^ -4 )

请注意,此表示法仅用于简要说明浮点数表示法,许多细节与IEEE754不同。

1 )不能正确表示0。 在IEEE754中,0.0一定是4字节的全零

2 )步骤代码的偏移也是错误的。 根据IEEE754,偏移量应该为3

3 )当阶数不是000或111时,此时,该尾数应该暗示归一化的数,即1.0

4 )步骤代码为000时,尾数为非正规化数

5 )次数代码为111时,IEEE规定为NaN特殊值

这些细节无暇深入,欢迎大家讨论。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。