现在有如下表达式:
System.out.println(2.00-1.10);
请问输出结果是???..
这里的答案是:0.8999999999999999......减不尽.
现在我们就详细剖析一下浮点型运算为什么会造成精度丢失?
1、小数的二进制表示问题
首先我们要搞清楚下面两个问题:
(1) 十进制整数如何转化为二进制数
算法很简单。举个例子,11表示成二进制数:
11/2=5 余 1
5/2=2 余 1
2/2=1 余 0
1/2=0 余 1
0结束 11二进制表示为(从下往上):1011
这里提一点:只要遇到除以后的结果为0了就结束了,大家想一想,所有的整数除以2是不是一定能够最终得到0。换句话说,所有的整数转变为二进制数的算法会不会无限循环下去呢?绝对不会,整数永远可以用二进制精确表示 ,但小数就不一定了。
(2) 十进制小数如何转化为二进制数
算法是乘以2直到没有了小数为止。举个例子,0.9表示成二进制数
0.9*2=1.8 取整数部分 1
0.8(1.8的小数部分)*2=1.6 取整数部分 1
0.6*2=1.2 取整数部分 1
0.2*2=0.4 取整数部分 0
0.4*2=0.8 取整数部分 0
0.8*2=1.6 取整数部分 1
0.6*2=1.2 取整数部分 0
......... 0.9二进制表示为(从上往下): 1100100100100......
注意:上面的计算过程循环了,也就是说*2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的 。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。
分享到:
相关推荐
基于FPGA自主控制浮点加减乘除控制器设计.pdf
浮点加减法的模拟验证
fpu(浮点加减乘除运算单元)的verilog代码和tb代码 转自opencores。 加减乘除
基于FPGA双精度浮点加减运算的验证.pdf
本代码可以实现浮点型的大数运算,包括加减乘除。可以通过改变SIZE和N的值来改变代码的性能
浮点数的加减运算,硬件实现,IC Design
mips整数运算模拟IEEE754浮点数运算的加减乘除
完整的32位浮点加法器设计DESIGN OF SINGLE PRECISION FLOAT ADDER (32-BIT NUMBERS) ACCORDING TO IEEE 754 STANDARD USING VHDL
基于FPGA自主控制浮点加减控制器设计.pdf
FPU - verilog实现的浮点运算单元,支持标准浮点数加减乘除 源代码也可以在github获取:https://github.com/yunwei37/ZJU-CS-GIS-ClassNotes/
用Verilog编写的32位加减法器,有nclaunch 仿真功能图,有design_vision 的门级仿真结果,代码提供了两种基础加法器架构:逐位进位加法器和超前进位加法器,值得学习。
基于RISC指令系统的32位浮点加减法运算器设计.doc
该工程代码实现了64位双精度浮点运算功能,所以的代码采用verilog 编写,附带测试脚本,以及进制转换工具。
linux下实现的浮点数精确计算,可以实现小数位借位
大家好,这个是IEEE754标准,32位的加减乘除ALU单元的代码。我是用VHDL写的,在modelsim里仿真通过。写好了testbench。直接打开就能看到结果。
2023计算机组成与结构(第十一讲)浮点加法、减法运算.pptx
包含浮点加减乘除,平方,倒数,指数,格式转化等很多实用的函数,用汇编实现
底层硬件如何实现浮点运算,详细解释fpga实现浮点运算
浮点运算方法和浮点运算器。主要介绍浮点运算的方法和流程以及浮点运算器。
第2部分 应用:x87fpu编程与vc6浮点库 第8章 x87fpu编程 第9章 编写自己的浮点库 第10章 如何反汇编代码 第11章 vc6浮点函数库 第12章 异常处理机制 第13章 浮点编程中的常见技巧 附录