十进制浮点数的表示方法

  

  使用十进制浮点数,可以避免二进制浮点数与我们习惯的十进制数之间的表示误差。这个在金融领域是非常重要的。但是计算机基本都只能对二进制浮点数进行计算,也就是IEEE754格式表示的浮点数。很多程序都会自己模拟十进制浮点数的计算。为了统一,IEEE754做了扩展,包括了十进制的浮点数。   

  

  IEEE 754 - 2008里面规定了十进制浮点数的一些规范。不过里面没有说具体的二进制表示方法。只是规定了32位,64位,128位的十进制浮点数的表示范围和有效位数。因为具体一个浮点数的二进制里面每个位表示啥,都是每个机器自己决定的。不需要跟外界一致。只是在传输的时候要保证数据的精度和范围一致就行了。下表来自维基百科,列出了每种浮点数的有效位数,指数的范围。   

  

  
  

              Name          共同name          Base          Digits          E min          E max                binary16          precision 一半;         2         10 + 1,         -14年         15               binary32          单一的precision          2         23 + 1,         -126年         127               binary64          双precision          2         52 + 1,         -1022年         1023               binary128          四precision          2         112 + 1,         -16382年         16383               decimal32          
        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这个库明显还在试验阶段,用起来比较麻烦。   

十进制浮点数的表示方法