


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java 中的浮点数剖析续Java 中的浮点数剖析续文 /BigBad. ,浮点数的精度:单精度数的尾数用 23 位存储,加上默认的小数点前的 1 位 1,2(23+1)=16777216 。因为 10716777216108,所以说单精度浮点数的有效 位数(精度)是 7 位(即小数点后 7位)。双精度的尾数用 52位存储, 2(52+1)=9007199254740992, 101690071992547409921017,所以双精度的有效位数(精度)是 16 位(即 小数点后 16 位)。如果你在浮点数的有效位后增加数字的话,结果是不会变化的:Java 代码System.out.print
2、ln(1.67772156F);/1.6777215System.out.println(1.67772 150123456789D);/1.6777215012345679float 取值范围:负数取值范围为 -3.4028235E+38-1.401298E-45 ,正数取值范围为 1.401298E- 453.4028235E+38。Float.MIN_VALUE:保持 float 类型数据的最小正非零值的常量,最小正非零值 为 2-149 。该常量等于十六进制的浮点文本 0x0.000002P-126f ,也等于 FBitsToFloat(0x1)=1.4e-45f 。(
3、二进制为: 0,00000000,00000000000000000000001)Float.MAX_VALUE:保持 float 类型的最大正有限大值的常量,最大正有限大值 为 (2-2-23)*2127 。该常量等于十六进制的浮点文本 0x1.fffffeP+127f ,也 等于FBitsToFloat(0x7f7fffff)=3.4028235e+38f 。(二进制为: 0,11111110,11111111111111111111111)Java 代码publicclassFloatTestpublicstaticvoidmain(Stringargs)/ 只要指数为
4、255,而尾数不为 0 时,该数不是一个数System.out.println(format(Integer.toBinaryString(0x7FC00000)+Floa BitsToFloat(0x7FC00000);/NaNSystem.out.println(format(Integer. toBinaryString(0xFFC00000)+FBitsToFloat(0xFFC00000);/Na NSystem.out.println(format(Integer.toBinaryString(0x7F800001)+Flo BitsToFlo
5、at(0x7F800001);/NaN/指数为 255,尾数为 0 时,该数就是无穷,符号位区分正无穷与负无穷System.out.println(format(Integer.toBinaryString(0x7F800000)+Floa BitsToFloat(0x7F800000);/InfinitySystem.out.println(format(Int eger.toBinaryString(0xFF800000)+FBitsToFloat(0xFF800000) ;/Infinity/ 规定指数与尾数都为 0 时,规定结果就是 0System.out.p
6、rintln(format(Integer.toBinaryString(0x0)+FB itsToFloat(0x0);/ 正的最小 float ,趋近于 0System.out.println(format(Integer.toBinaryString(0x1)+FB itsToFloat(0x1);/1.4E-45/ 正的最大 floatSystem.out.println(format(Integer.toBinaryString(0x7f7fffff)+ +FBitsToFloat(0x7f7fffff);/3.4028235E38/
7、负的最大 float ,趋 近于 0System.out.println(format(Integer.toBinaryString(0x80000001)+Flo BitsToFloat(0x80000001);/-1.4E-45/ 负的最小 floatSystem.out.println(format(Integer.toBinaryString(0xFf7fffff)+ +FBitsToFloat(0xFf7fffff);/- 3.4028235E38privatestaticStringformat(Stringstr)StringBuffersb=newS
8、 tringBuffer(str);intsub=32- str.length();if(sub!=0)for(inti=0;isub;i+)sb.insert(0,0);sb.ins ert(1,);sb.insert(10,);returnsb.toString();2-149=(0.00000000000000000000001)*2- 127=(00000000000000000000000.1)*2-149=0x0.000002P- 126f=0.000000000000000000000010*2126 (2-2-23)*2127=(10.000000000000000000000
9、00- 0.00000000000000000000001)*21270x1.fffffeP+127f=0x1.111111111111111111111110P+127double 取值范围:负值取值范围 -1.79769313486231570E+308-4.94065645841246544E-324,正值 取值范围为 4.94065645841246544E-3241.79769313486231570E+308。Double.MIN_VALUE:保持 double 类型数据的最小正非零值的常量,最小正非零 值为 2-1074 。它等于十六进制的浮点字面值 0x0.0000000000
10、001P-1022,也等 于Double.longBitsToDouble(0x1L)Double.MAX_VALUE保持 double 类型的最大正有限值的常量,最大正有限值为(2-2-52)*21023 。它等于十六进制的浮点字面值0x1.fffffffffffffP+1023 ,也等于Double.longBitsToDouble(0x7fefffffffffffffL)Java 中的小数精确计算Java 代码publicclassFloatCalc/ 默认除法运算精度 privatestaticfinalintDEF_DIV_SCALE=10;/* 提供精确的加法运算。 *paramv
11、1被加数 *paramv2加数*return 两个参数的和 */publicstaticdoubleadd(doublev1,doublev2)BigDecimalb1=newBigDecimal (Double.toString(v1);BigDecimalb2=newBigDecimal(Double.toString(v2) ;returnb1.add(b2).doubleValue();/* 提供精确的减法运算。 *paramv1被 减数 *paramv2减数*return 两个参数的差 */publicstaticdoublesub(doublev1,doublev2)BigDeci
12、malb1=newBigDecimal (Double.toString(v1);BigDecimalb2=newBigDecimal(Double.toString(v2) ;returnb1.subtract(b2).doubleValue();/* 提供精确的乘法运算。 *paramv1被乘数 *paramv2乘数*return 两个参数的积 */publicstaticdoublemul(doublev1,doublev2)BigDecimalb1=newBigDecimal (Double.toString(v1);BigDecimalb2=newBigDecimal(Double.
13、toString(v2) ;returnb1.multiply(b2).doubleValue();/* 提供(相对)精确的除法运 算,当发生除不尽的情况时,精确到 *小数点以后 10 位,以后的数字四舍五 入。 *paramv1被除数 *paramv2除数*return 两个参数的商 */publicstaticdoublediv(doublev1,doublev2)returndiv(v1,v2,DEF_DIV_SC ALE);/* 提供(相对)精确的除法运算。当发生除不尽的情况时,由 scale 参数指 *定精度,以后的数字四舍五入。 *paramv1被除数 *paramv2除数 *pa
14、ramscale 表示表示需要精确到小数点以后几位。 *return 两个参数的商 */publicstaticdoublediv(doublev1,doublev2,intscale)if(scale0)throw newIllegalArgumentException(Thescalemustbeapositiveintegerorzero); BigDecimalb1=newBigDecimal(Double.toString(v1);BigDecimalb2=newBigDe cimal(Double.toString(v2);returnb1.divide(b2,scale,BigDecimal.ROUND_ HALF_UP).doubleValue();/* 提供精确的小数位四舍五入处理。 *paramv需 要四舍五入的数字 *paramscale 小数点后保留几位 *return 四舍五入后的结果 */publicstaticdoubleround(doublev,intscale)if(scale0)thrownewIlleg
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 为什么中国大量使用自行车11篇
- 我的朋友250字7篇
- 流浪地球观后感3550字10篇
- 纪检办案经验课件
- 早癌筛查教学课件
- 企业资料档案管理系统模板
- 庐山谣的文化内涵与自然美景:高二语文课文深度解读教案
- 地理《世界地理知识竞赛》教案
- 生活中的传统文化8篇范文
- 纪念刘和君课件
- (2025)行政执法人员考试题库(附答案)
- 奇瑞购销协议书范本
- 社区模拟试题和答案
- 1-安全生产治本攻坚三年行动工作方案及台账模板(2024-2026年)
- 银行测试管理办法
- 2025年技师(二级)养老护理员职业技能鉴定《理论知识》真题卷(后附答案和解析)
- CQI审核管理办法
- 境外常驻人员管理办法
- 反恐怖宣传课件
- 教培机构开学季活动策划方案
- 2025至2030中国城市地下管线探测行业发展状况与投资策略分析报告
评论
0/150
提交评论