程序包 org.hipparchus.dfp


package org.hipparchus.dfp
Java的十进制浮点库

另一个浮点类。这个类使用基数10000,几乎是十进制。

设计目标如下:

  1. 十进制数学,或接近十进制
  2. 可设置精度(但不允许使用不同设置的数字混合)
  3. 可移植性。代码应尽可能保持可移植性。
  4. 性能
  5. 准确性 - 基本代数运算的结果应始终为+/- 1 ULP
  6. 尽可能遵守IEEE 854-1987标准。(请参阅下面的IEEE 854-1987注释)

权衡:

  1. 内存占用。为了获得更好的性能,我使用了比必要更多的内存来表示数字。
  2. 数字更大,因此舍入损失更大。因此,如果您真的需要12个十进制数字,最好使用4个基数10000的数字,其中一个可以是部分填充的。

数字以以下形式表示:

\[ n = \mathrm{sign} \times \mathrm{mant} \times \mathrm{radix}^\mathrm{exp} \]

其中sign为±1,mantissa表示介于零和一之间的分数。mant[0]是最不重要的数字。exp的范围为-32767到32768

IEEE 854-1987注释和差异

IEEE 854要求基数为2或10。这里的基数是10000,因此未满足该要求,但可以通过创建一个子类使其表现为基数10数字。我认为,如果它看起来和行为像基数10数字,那么它就是一个,那么该要求将得到满足。

选择基数10000是因为一次操作4个十进制数字应该比逐个操作更快。通过添加额外的舍入步骤,可以实现基数10的行为,以确保所表示的十进制数字的数量是恒定的。

IEEE标准明确排除了内部数据编码,因此可以合理地得出结论,这种基数10000系统的子类仅仅是基数10系统的编码。

IEEE 854还规定了“次标准”数字的存在。此类不包含任何此类实体。最重要的基数10000数字始终不为零。相反,我们通过在指数小于expMin的数字上升到下溢标志来支持“渐进下溢”,但在指数达到MIN_EXP-digits之前不会刷新为零。因此,我们可以表示的最小数字是:1E(-(MIN_EXP-digits-1)∗4),例如,对于digits=5,MIN_EXP=-32767,那将是1e-131092。

IEEE 854定义隐含基数点位于最重要数字的右侧,位于其余数字的左侧。此实现将隐含基数点放在所有数字的左侧,包括最重要的数字。这是一个细节问题,实际上只是一个定义问题。这种情况的任何副作用都可以通过子类来隐藏。