程序包 org.hipparchus.dfp

类 DfpMath

java.lang.Object
org.hipparchus.dfp.DfpMath

public class DfpMath extends Object
Dfp一起使用的数学例程。常量在DfpField中定义
  • 方法概要

    修饰符和类型
    方法
    说明
    static Dfp
    acos(Dfp a)
    计算参数的反余弦。
    static Dfp
    asin(Dfp a)
    计算参数的反正弦。
    static Dfp
    atan(Dfp a)
    计算参数的反正切。使用典型的泰勒级数,但可能使用以下恒等式来减少参数:tan(x+y) = (tan(x) + tan(y)) / (1 - tan(x)*tan(y)),因为tan(PI/8) = sqrt(2)-1,atan(x) = atan( (x - sqrt(2) + 1) / (1+x*sqrt(2) - x) + PI/8.0
    protected static Dfp
    计算参数的反正切。
    static Dfp
    cos(Dfp a)
    计算参数的余弦。
    protected static Dfp
    计算cos(a) 当 0 < a < pi/4 时使用。
    static Dfp
    exp(Dfp a)
    计算给定幂的e。
    protected static Dfp
    计算给定幂的e。
    static Dfp
    log(Dfp a)
    返回a的自然对数。
    protected static Dfp[]
    计算0到2之间数字的自然对数。
    static Dfp
    pow(Dfp base, int a)
    通过连续平方将底数提高到幂。
    static Dfp
    pow(Dfp x, Dfp y)
    计算x的y次幂。
    static Dfp
    sin(Dfp a)
    计算参数的正弦。
    protected static Dfp
    计算sin(a) 当 0 < a < pi/4 时使用。
    protected static Dfp[]
    split(Dfp a)
    Dfp拆分为两个Dfp,使它们的和等于输入的Dfp
    protected static Dfp[]
    split(DfpField field, String a)
    将字符串表示拆分为两个dfp。
    protected static Dfp[]
    splitDiv(Dfp[] a, Dfp[] b)
    将拆分为两个应相加的部分的数字相除。
    protected static Dfp[]
    splitMult(Dfp[] a, Dfp[] b)
    将拆分为两个应相加的部分的数字相乘。
    protected static Dfp
    splitPow(Dfp[] base, int a)
    将拆分的底数提高到a次幂。
    static Dfp
    tan(Dfp a)
    计算参数的正切。

    从类继承的方法 java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 方法详细资料

    • split

      protected static Dfp[] split(DfpField field, String a)
      将字符串表示拆分为两个dfp。

      这两个dfp的和等于输入字符串,但比使用单个dfp具有更高的精度。这对于提高指数运算和关键乘法的准确性很有用。

      参数:
      field - Dfp必须属于的字段
      a - 要拆分的字符串表示
      返回:
      两个Dfp数组,其和为a
    • split

      protected static Dfp[] split(Dfp a)
      Dfp拆分为两个Dfp,使它们的和等于输入的Dfp
      参数:
      a - 要拆分的数字
      返回:
      包含拆分数字的两个元素数组
    • splitMult

      protected static Dfp[] splitMult(Dfp[] a, Dfp[] b)
      将拆分为两个应相加的部分的数字相乘。使用二项式乘法,因此ab = a0 b0 + a0 b1 + a1 b0 + a1 b1 将第一项存储在result0中,其余部分存储在result1中
      参数:
      a - 乘法的第一个因子,以拆分形式给出
      b - 乘法的第二个因子,以拆分形式给出
      返回:
      a × b,以拆分形式
    • splitDiv

      protected static Dfp[] splitDiv(Dfp[] a, Dfp[] b)
      将拆分为两个应相加的部分的数字相除。与上面的拆分乘法的逆过程:(a+b) / (c+d) = (a/c) + ( (bc-ad)/(c**2+cd) )
      参数:
      a - 被除数,以拆分形式给出
      b - 除数,以拆分形式给出
      返回:
      a / b,以拆分形式
    • splitPow

      protected static Dfp splitPow(Dfp[] base, int a)
      将拆分的底数提高到a次幂。
      参数:
      base - 要提高的数字
      a - 幂
      返回:
      basea
    • pow

      public static Dfp pow(Dfp base, int a)
      通过连续平方将底数提高到幂。
      参数:
      base - 要提高的数字
      a - 幂
      返回:
      basea
    • exp

      public static Dfp exp(Dfp a)
      计算给定幂的e。a被拆分为两部分,使a = n+m,其中n是整数。我们使用pow()计算en,并使用泰勒级数计算em。我们返回e*n × em
      参数:
      a - 应提高e的幂
      返回:
      ea
    • expInternal

      protected static Dfp expInternal(Dfp a)
      计算给定幂的e。其中 -1 < a < 1。使用经典的泰勒级数。1 + x**2/2! + x**3/3! + x**4/4! ...
      参数:
      a - 应提高e的幂
      返回:
      ea
    • log

      public static Dfp log(Dfp a)
      返回a的自然对数。a首先被拆分为三部分,使a = (10000^h)(2^j)k。通过ln(a) = ln(5)*h + ln(2)*(h+j) + ln(k) 计算ln(a) k在范围2/3 < k < 4/3,并传递给一个级数展开。
      参数:
      a - 请求对数的数字
      返回:
      log(a)
    • logInternal

      protected static Dfp[] logInternal(Dfp[] a)
      计算0到2之间数字的自然对数。设f(x) = ln(x),我们知道f'(x) = 1/x,因此根据泰勒定理,我们有: ----- n+1 n f(x) = \ (-1) (x - 1) / ---------------- for 1 <= n <= infinity ----- n or 2 3 4 (x-1) (x-1) (x-1) ln(x) = (x-1) - ----- + ------ - ------ + ... 2 3 4 alternatively, 2 3 4 x x x ln(x+1) = x - - + - - - + ... 2 3 4 This series can be used to compute ln(x), but it converges too slowly. If we substitute -x for x above, we get 2 3 4 x x x ln(1-x) = -x - - - - - - + ... 2 3 4 Note that all terms are now negative. Because the even powered ones absorbed the sign. Now, subtract the series above from the previous one to get ln(x+1) - ln(1-x). Note the even terms cancel out leaving only the odd ones 3 5 7 2x 2x 2x ln(x+1) - ln(x-1) = 2x + --- + --- + ---- + ... 3 5 7 By the property of logarithms that ln(a) - ln(b) = ln (a/b) we have: 3 5 7 x+1 / x x x \ ln ----- = 2 * | x + ---- + ---- + ---- + ... | x-1 \ 3 5 7 / But now we want to find ln(a), so we need to find the value of x such that a = (x+1)/(x-1). This is easily solved to find that x = (a-1)/(a+1).
      参数:
      a - 请求对数的数字,以拆分形式给出
      返回:
      log(a)
    • pow

      public static Dfp pow(Dfp x, Dfp y)
      计算x的y次幂。

      使用以下方法:

      1. 设置u = rint(y),v = y-u
      2. 计算a = v * ln(x)
      3. 计算b = rint( a/ln(2) )
      4. 计算c = a - b*ln(2)
      5. xy = xu * 2b * ec
      如果|y| > 1e8,则通过exp(y*ln(x))计算

      特殊情况

      • 如果y为0.0或-0.0,则结果为1.0
      • 如果y为1.0,则结果为x
      • 如果y为NaN,则结果为NaN
      • 如果x为NaN且y不为零,则结果为NaN
      • 如果|x| > 1.0且y为+Infinity,则结果为+Infinity
      • 如果|x| < 1.0且y为-Infinity,则结果为+Infinity
      • 如果|x| > 1.0且y为-Infinity,则结果为+0
      • 如果|x| < 1.0且y为+Infinity,则结果为+0
      • 如果|x| = 1.0且y为+/-Infinity,则结果为NaN
      • 如果x为+0且y > 0,则结果为+0
      • 如果x为+Inf且y < 0,则结果为+0
      • 如果x为+0且y < 0,则结果为+Inf
      • 如果x为+Inf且y > 0,则结果为+Inf
      • 如果x为-0且y > 0,有限,且不是奇整数,则结果为+0
      • 如果x为-0且y < 0,有限,且是奇整数,则结果为-Inf
      • 如果x为-Inf且y > 0,有限,且是奇整数,则结果为-Inf
      • 如果x为-0且y < 0,不是有限奇整数,则结果为+Inf
      • 如果x为-Inf且y >
      参数:
      x - base to be raised
      y - power to which base should be raised
      返回:
      xy
    • sinInternal

      protected static Dfp sinInternal(Dfp[] a)
      Computes sin(a) Used when 0 < a < pi/4. Uses the classic Taylor series. x - x**3/3! + x**5/5! ...
      参数:
      a - number from which sine is desired, in split form
      返回:
      sin(a)
    • cosInternal

      protected static Dfp cosInternal(Dfp[] a)
      Computes cos(a) Used when 0 < a < pi/4. Uses the classic Taylor series for cosine. 1 - x**2/2! + x**4/4! ...
      参数:
      a - number from which cosine is desired, in split form
      返回:
      cos(a)
    • sin

      public static Dfp sin(Dfp a)
      computes the sine of the argument.
      参数:
      a - 欲求正弦的数字
      返回:
      sin(a)
    • cos

      public static Dfp cos(Dfp a)
      计算参数的余弦值。
      参数:
      a - 欲求余弦的数字
      返回:
      cos(a)
    • tan

      public static Dfp tan(Dfp a)
      计算参数的正切值。
      参数:
      a - 欲求正切的数字
      返回:
      tan(a)
    • atanInternal

      protected static Dfp atanInternal(Dfp a)
      计算参数的反正切值。
      参数:
      a - 欲求反正切的数字
      返回:
      atan(a)
    • atan

      public static Dfp atan(Dfp a)
      计算参数的反正切值。使用典型的泰勒级数,但可能使用以下恒等式简化参数:tan(x+y) = (tan(x) + tan(y)) / (1 - tan(x)*tan(y)),因为tan(PI/8) = sqrt(2)-1,所以atan(x) = atan( (x - sqrt(2) + 1) / (1+x*sqrt(2) - x) + PI/8.0
      参数:
      a - 欲求反正切的数字
      返回:
      atan(a)
    • asin

      public static Dfp asin(Dfp a)
      计算参数的反正弦值。
      参数:
      a - 欲求反正弦的数字
      返回:
      asin(a)
    • acos

      public static Dfp acos(Dfp a)
      计算参数的反余弦值。
      参数:
      a - 欲求反余弦的数字
      返回:
      acos(a)