使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差。这个在金融领域是非常重要的。但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数。很多程序都会自己模拟十进制浮点数的计算。为了统一,IEEE754做了扩展,包括了十进制的浮点数。
IEEE 754 - 2008里面规定了十进制浮点数的一些规范。不过里面没有说具体的二进制表示方法。只是规定了32位,64位,128位的十进制浮点数的表示范围和有效位数。因为具体一个浮点数的二进制里面每个位表示啥,都是每个机器自己决定的。不需要跟外界一致。只是在传输的时候要保证数据的精度和范围一致就行了。下表来自维基百科,列出了每种浮点数的有效位数,指数的范围。
10 7 -95年 96 decimal64
10 16 -383年 384 decimal128
10 34 -6143年
6144年,
实际的系统中,十进制浮点数有两种表示方法,分别是密集的小数(密集十进制数)二进制整数和小数(二进制整数表示的十进制数)。
DPD表示方便转换成十进制的浮点数字符串,但是需要专门的计算单元来做计算,软件模拟比较麻烦。
而报价表示更直观,转换到二进制会比较容易。很方便用二进制的整数运算单元来计算。
所以Power6上有了硬件的十进制浮点计算单元,就用DPD表示。而在x86 x64处理器上没有十进制计算单元,各种软件实现的十进制浮点库默认大都用投标方式表示。比如英特尔就实现了一个开源的c语言的十进制浮点数库.北京://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library/
十进制浮点的意义,在于更符合人们的习惯,比如下面的例子
-
<李>
的头
h
,
主要
,
,,,,一个的两倍
7
,,,,b的两倍
0
00007
,,,printf
一个
b
100000
,
李>,
正确的输出应该是1,但是实际的输出结果是0,在做相等比较的时候,还不得不考虑一下这个误差了。而某些时候误差会在计算过程中累计,变成比较明显的错误了。
如果用英特尔的十进制浮点库赖做这个计算,结果就会不同了.intel这个库明显还在试验阶段,用起来比较麻烦。