毕业设计做网站想法,谷歌优化培训,建设部网站首页,域名排名查询Java浮点数浮点数结构要说清楚Java浮点数的取值范围与其精度#xff0c;必须先了解浮点数的表示方法#xff0c;浮点数的结构组成#xff0c;之所以会有这种所谓的结构#xff0c;是因为机器只认识01#xff0c;你想表示小数#xff0c;你要机器认识小数点这个东西#…Java浮点数浮点数结构要说清楚Java浮点数的取值范围与其精度必须先了解浮点数的表示方法浮点数的结构组成之所以会有这种所谓的结构是因为机器只认识01你想表示小数你要机器认识小数点这个东西必须采用某种方法比如简单点的float四个字节前两个字节表示整数位后两个字节表示小数位(这就是一种规则标准)这样就组成一个浮点数。而Java中浮点数采用的是IEEE 754标准。IEEE 754这里就不细说什么是IEEE 754了就直接讲具体内容有兴趣的可以自己百度。float符号位(S)1bit指数位(E)8bit尾数位(M)23bit一个float4字节32位分为三部分符号位指数位尾数位。(1).符号位(S)最高位(31位)为符号位表示整个浮点数的正负0为正1为负(2).指数位(E)23-30位共8位为指数位这里指数的底数规定为2(取值范围0~255)。这一部分的最终结果格式为2E−127即范围-127~128。另外标准中还规定了当指数位8位全0或全1的时候浮点数为非正规形式(这个时候尾数不一样了)所以指数位真正范围为-126~127。(3).尾数位(M)0-22位共23位为尾数位表示小数部分的尾数即形式为1.M或0.M至于什么时候是1什么时候是0则由指数和尾数共同决定。 小数部分最高有效位是1的数被称为正规(规格化)形式。小数部分最高有效位是0的数被称为非正规(非规格化)形式其他情况是特殊值。 最终float的值 (−1)S∗(2E−127)∗(1.M)。具体形式如下符号指数部分指数部分-127尾数部分小数部分的最高有效位形式1255128非0没有NaN12551280没有负无穷11~254-126~127任意1正规形式(负数)10-127非00非正规形式(负数)10-1270没有负000-1270没有正000-127非00非正规形式(正数)01~254-126~127任意1正规形式(正数)02551280没有正无穷0255128非0没有NaNdouble符号位(S)1bit指数位(E)11bit尾数位(M)52bitdouble这里就类似float只是double的长度更大所以范围就更大但规则是一样的。double的值 (−1)S∗(2E−1023)∗(1.M)。取值范围根据表1可知float的取值范围负无穷 —— −2128 ~~~ −2−149 —— 0 —— 2−149 ~~2128 —— 正无穷1). 上面的“——”表示中间不能取值例如负无穷到−2128中间的值是取不到的(事实上128也是取不到的只是接近近似值)但这并不是意味着“~”任意值都能取到的要注意浮点数都是有精度的并不能表示绝对值任意小的值。另外Java中无穷大表示为Float.POSITIVE_INFINITY或Double.POSITIVE_INFINITY//表示正无穷大Float.NEGATIVE_INFINITY或Double.NEGATIVE_INFINITY//负无穷大//他们打印的结果/-Infinityfloat f1 (float)Math.pow(2,128);//指数128的打印结果Infinity//上面要加(float)强制转换否则编译提示出错详细可参考前一节Java变量数据类型float f2 (float)Math.pow(2,127);//1.7014118E38System.out.println(Float.MAX_VALUE);//3.4028235E38//其他测试读者可自行测试123456782). -149的得来看上面理论应该是150(指数全0则指数值 0 -127这个时候尾数取最小2−23则-127-23 -150)可不知道为什么是149我查到的资料是说全0全1为特殊值不作为范围内的值上面的float的最大最小值Float.MAX_VALUE都是接近2128)。故值 (−1)S∗(2−126)∗(2−23) /-2−149float f3 (float) Math.pow(2,-149)//1.4E-45小于-149结果则为0.0Float.MIN_VALUE //1.4E-4512double的取值同float负无穷 —— −21024 ~~~ −2−1074 —— 0 —— 2−1074 ~~21024 —— 正无穷1074 | (-1022) - (52)|另外注意表格中还有NaN即表示非数值例如System.out.println(0.0/0.0);//打印结果NaN。注意不能是 0/0//NaN表示计算错误具体出现情况可以参考表中//Float.NaN或 Double.NaN 也能直接表示NaNNaN与其他数计算结果均为NaN除了Math.pow(Float.NaN,0);//结果为1.0//另外NaN NaN; false12345浮点数精度精度是由尾数决定的为什么由浮点数的值计算公式可知当指数的最终值为负虽然这个时候浮点数的值能表示更小但这个时候仅仅能表示0~1(或-1~0)这个数段的小数没有实际意义。所以精度主要是看尾数的值。floatfloat的尾数23位其范围为0~223而2238388608106.92所以float的精度为6~7位能保证6位为绝对精确7位一般也是正确的8位就不一定了(但不是说8位就绝对不对了)注意这里的6~7位是有效小数位(大的数你先需要转换成小数的指数形式例如8317637.5其有效小数位8.3176375E6七位)而有效位(从第一个不为0的开始数)是7~8位是包括整数位的像8317637.5你不转换则要从有效位的角度来看有8位有效位。System.out.println((float)Math.pow(10,6.92));//注意加float强制转换//打印结果8317637.5float只保证7~8位有效位其余位数舍入12不理解的话可以再这样想23位二进制0101……0101尾数表示小数位最小为0000……0001(22个0最后一个1)即2−231.1920929E-7 这是float的最小单元(大概是0.0000001192大小你想表示比这更小的比如0.00000001不可能啊)这是一个7位小数位小数最小就是这么小比这个更小的计算机就无能为力了比这个更大的每次通过加这么一个最小单元直到相等或接近(两个相差一个最小单元的数它们之间的数也是不能表示的所以有的7位也是不能精确的因为最小不是0.0000001而是比这个稍大)。double计算方式同floatdouble的尾数52位2−522.220446049250313E-16最小是16位但最小不是1.0E-16所以精度是15~16能保证15一般16位。更多关于Java浮点数的可以参考这里基础野细说浮点数(肥子John)