数学类函数(转载)

**************************数学单元*********************************
           Delphi / Kylix 跨平台运行时Runtime库
           Copyright (c) 1996, 2001 Borland 软件
*******************************************************************

这个单元包含高性能的算术、三角、对数、统计和金融方面的计算及FPU程序函数用于补充Delphi 语言System.pas单元中的数学常规程序函数

参考:

    1)P.J. Plauger,"The Standard C Library", Prentice-Hall, 1992, Ch. 7. 《标准C程序库》
    2)W.J. Cody, Jr., and W. Waite, "Software Manual For the Elementary Functions", Prentice-Hall, 1980.《软件手册初步》
    3)Namir Shammas, "C/C++ Mathematical Algorithms for Scientists and Engineers", McGraw-Hill, 1995, Ch 8.《C/C++ 数学的运算法则对于科学家和工程师》
    4)H.T. Lau, "A Numerical Library in C for Scientists and Engineers", CRC Press, 1994, Ch. 6.《C语言中的数字的程序库对于科学家和工程师》
    5)"Pentium(tm) Processor User's Manual, Volume 3: Architecture and Programming Manual", Intel, 1994《Pentium(tm) 处理器使用手册,第 3 册: 体系结构和程序手册》

注意:

    1) 对于有些函数,这个单元中涉及的概念或常数由Earl F. Glynn (www.efg2.com) 和 Ray Lischner (www.tempest-sw.com)提供。
    2) 所有的角度参数三角函数的结果都用弧度表示
    3) 下列大部分的三角和对数程序直接的映射到Intel 80387 FPU
    4) 浮点机指令、输入域、输出范围和错误处理主要由 FPU 硬件决定
    5) 汇编程序中的代码支持Pentium FPU 管线体系
    l  常数
    IEEE 浮点类型的范围, 包括非正规的  
    1)  MinSingle =  1.5e-45;                 最小Single数
    2)  MaxSingle =  3.4e+38;                 最大Single数  
    3)  MinDouble =  5.0e-324;                最小Double数
    4)  MaxDouble =  1.7e+308;                最大Double数
    5)  MinExtended =  3.4e-4932;             最小Extended数
    6)  MaxExtended =  1.1e+4932;             最大Extended数
    7)  MinComp = -9.223372036854775807e+18;  最小Comp数
    8)  MaxComp =  9.223372036854775807e+18;  最大Comp数

    下列常数不应当被用于比较关系,仅仅用于分配。若要用于比较关系请使用IsNan 和 IsInfinity 函数。(已提供在后面)
    9)  NaN =  0.0 / 0.0;            非数      (*$EXTERNALSYM NaN*)          (*$HPPEMIT 'static const Extended NaN = 0.0 / 0.0;'*)
    10) Infinity =  1.0 / 0.0;       正无穷大  (*$EXTERNALSYM Infinity*)     (*$HPPEMIT 'static const Extended Infinity = 1.0 / 0.0;'*)
    11) NegInfinity = -1.0 / 0.0;    负无穷大  (*$EXTERNALSYM NegInfinity*)  (*$HPPEMIT 'static const Extended NegInfinity = -1.0 / 0.0;'*)

一、三角函数
    1)  函数 ArcCos(const X: Extended): Extended;          (IN: |X| <= 1  OUT: [0..PI] 弧度)
    2)  函数 ArcSin(const X: Extended): Extended;          (IN: |X| <= 1 OUT: [-PI/2..PI/2] 弧度)
    3)  函数 ArcTan2(const Y, X: Extended): Extended;      (IN: |Y| < 2^64, |X| < 2^64, X <> 0  OUT: [-PI..PI] 弧度)。计算 ArcTan(Y/X), 并且返回一个正确象限内的角度)
    4)  过程 SinCos(const Theta: Extended; var Sin, Cos: Extended) register;
    SinCos:比分别调用Sin 和Cos 计算同一个角度快两倍
    5)  函数 Tan(const X: Extended): Extended;
    6)  函数 Cotan(const X: Extended): Extended;           { 1 / tan(X), X <> 0 }
    7)  函数 Secant(const X: Extended): Extended;          { 1 / cos(X) }
    8)  函数 Cosecant(const X: Extended): Extended;        { 1 / sin(X) }
    9)  函数 Hypot(const X, Y: Extended): Extended;        { Sqrt(X**2 + Y**2) }

二、角度单位换算程序
    1)  函数 RadToDeg(const Radians: Extended): Extended;  { 度数:= 弧度 * 180 / PI }
    2)  函数 RadToGrad(const Radians: Extended): Extended; { 梯度:= 弧度 * 200 / PI }
    3)  函数 RadToCycle(const Radians: Extended): Extended;{ 圆周:= 弧度 / 2PI }
    4)  函数DegToRad(const Degrees: Extended): Extended;   {弧度:= 度数* PI / 180}
    5)  函数DegToGrad(const Degrees: Extended): Extended;
    6)  函数DegToCycle(const Degrees: Extended): Extended;
    7)  函数GradToRad(const Grads: Extended): Extended;    {弧度:= 梯度 * PI / 200 }
    8)  函数GradToDeg(const Grads: Extended): Extended;
    9)  函数GradToCycle(const Grads: Extended): Extended;
    10) 函数CycleToRad(const Cycles: Extended): Extended;  {弧度:= 圆周* 2PI }
    11) 函数CycleToDeg(const Cycles: Extended): Extended;
    12) 函数CycleToGrad(const Cycles: Extended): Extended;

三、双曲线函数
    1)  弧度 Cot(const X: Extended): Extended;             { 别名为 Cotan }
    2)  函数 Sec(const X: Extended): Extended;             { 别名为 Secant }
    3)  函数 Csc(const X: Extended): Extended;             { 别名为 Cosecant }
    4)  函数 Cosh(const X: Extended): Extended;
    5)  函数 Sinh(const X: Extended): Extended;
    6)  函数 Tanh(const X: Extended): Extended;
    7)  函数 CotH(const X: Extended): Extended;
    8)  函数 SecH(const X: Extended): Extended;
    9)  函数 CscH(const X: Extended): Extended;
    10) 函数 ArcCot(const X: Extended): Extended;          { IN: X <> 0 }
    11) 函数 ArcSec(const X: Extended): Extended;          { IN: X <> 0 }
    12) 函数 ArcCsc(const X: Extended): Extended;          { IN: X <> 0 }
    13) 函数 ArcCosh(const X: Extended): Extended;         { IN: X >= 1 }
    14) 函数 ArcSinh(const X: Extended): Extended;
    15) 函数 ArcTanh(const X: Extended): Extended;         { IN:|X|<= 1 }
    16) 函数 ArcCotH(const X: Extended): Extended;         { IN: X <> 0 }
    17) 函数 ArcSecH(const X: Extended): Extended;         { IN: X <> 0 }
    18) 函数 ArcCscH(const X: Extended): Extended;         { IN: X <> 0 }

四、对数函数
    1)  函数 LnXP1(const X: Extended): Extended;           {Ln(X + 1), accurate for X near zero }
    2)  函数 Log10(const X: Extended): Extended;           {基数为10的X对数}
    3)  函数 Log2(const X: Extended): Extended;            {基数为2的X对数}
    4)  函数 LogN(const Base, X: Extended): Extended;      {基数为N的X对数}

五、指数函数
    1)  函数 IntPower(const Base: Extended; const Exponent: Integer): Extended register;
             IntPower:任意基数Base的Exponent整数幂。快
    2)  函数 Power(const Base, Exponent: Extended): Extended;
             Power:任意基数的任意幂; 对于分指数或 |指数| > MaxInt, 基数必须> 0.

六、各种例程
    1)  过程 Frexp(const X: Extended; var Mantissa: Extended; var Exponent: Integer) register;
             Frexp:分离X 的尾数和指数
    2)  函数 Ldexp(const X: Extended; const P: Integer): Extended register;
             Ldexp:返回 X*2^P
    3)  函数 Ceil(const X: Extended):Integer;
             Ceil:最小整数> = X, |X| < MaxInt
    4)  函数 Floor(const X: Extended): Integer;
             Floor:最大整数< = X,  |X| < MaxInt
    5)  函数 Poly(const X: Extended; const Coefficients: array of Double): Extended;
             Ploy:计算一元多项式A[0] + A[1]*X + ... + A[N]*X^N 在变量为X时的值。

七、统计函数
    对于这些统计的和财政函数,普通的商业表宏名字已经写在每个函数后面的注释中
    1)  函数 Mean(const Data: array of Double): Extended;
        算术平均值(AVG):  SUM / N ;SUM(Data) / (High(Data) - Low(Data) + 1)
    2)  函数 Sum(const Data: array of Double): Extended register;                     求Double数的和 (SUM) }
    3)  函数 SumInt(const Data: array of Integer): Integer register;                  求Integer数和
    4)  函数 SumOfSquares(const Data: array of Double): Extended;Double平方和
    5)  过程 SumsAndSquares(const Data: array of Double; var Sum, SumOfSquares: Extended) register;返回Double总和、平方和
    6)  函数 MinValue(const Data: array of Double): Double;                           返回Double数组中最小数(MIN)
    7)  函数 MinIntValue(const Data: array of Integer): Integer;                      返回Integer数组中最小数(MIN)
    8)  函数 Min(const A, B: Integer): Integer; overload;                             返回最小整数
    9)  函数 Min(const A, B: Int64): Int64; overload;                                 返回最小Int64数
    10) 函数 Min(const A, B: Single): Single; overload;                               返回最小Single数
    11) 函数 Min(const A, B: Double): Double; overload;                               返回最小Double数
    12) 函数 Min(const A, B: Extended): Extended; overload ;                          返回最小Extended数
    13) 函数 MaxValue(const Data: array of Double): Double;                           返回Double数组最大数(MAX)
    14) 函数 MaxIntValue(const Data: array of Integer): Integer;                      返回Integer数组最大数
    15) 函数 Max(const A, B: Integer): Integer; overload;                             返回最大Integer数
    16) 函数 Max(const A, B: Int64): Int64; overload;                                 返回最大Int64数
    17) 函数 Max(const A, B: Single): Single; overload;                               返回最大Single数
    18) 函数 Max(const A, B: Double): Double; overload;                               返回最大Double数
    19) 函数 Max(const A, B: Extended): Extended; overload;                           返回最大Extended数

    20) 函数 StdDev(const Data: array of Double): Extended;
    样本标准偏差STD; Sqrt(Variance(Data))

    21) 过程 MeanAndStdDev(const Data: array of Double; var Mean, StdDev: Extended);
    在一次调用中计算算术平均值(Mean)和标准偏差(StdDev)

    22) 函数 PopnStdDev(const Data: array of Double): Extended;
    总体标准差;Sqrt(PopnVariance(Data))

    23) 函数 Variance(const Data: array of Double): Extended;
    采样方差(样品方差);TotalVariance(Data) / (High(Data) - Low(Data))

    24) 函数 PopnVariance(const Data: array of Double): Extended;
    总体方差:(VAR or VARP): TotalVariance/ N }; TotalVariance(Data) / (High(Data) - Low(Data) + 1)

    25) 函数 TotalVariance(const Data: array of Double): Extended;
    方差总合:SUM(i=1,N)[(X(i) - Mean)**2] ;SumSquares - Sqr(Sum)/(High(Data) - Low(Data) + 1)

    26) 函数 Norm(const Data: array of Double): Extended;
    欧几里得L2-范数Sqrt(SumOfSquares)

    27) 过程 MomentSkewKurtosis(const Data: array of Double; var M1, M2, M3, M4, Skew, Kurtosis: Extended);
        MomentSkewKurtosis::计算统计分解的核心因数
        M1:平均值(Mean)
        M2:方差(Variance)
        Skew:反映分布的对称性[M3 / (M2**(3/2))]
        Kurtosis:反映分布的平坦性[M4 / Sqr(M2)]
    28) 函数 RandG(Mean, StdDev: Extended): Extended;
        RandG:产生一个随机数,随机数符合正态分布于Mean数附近,用于模拟数据抽取样品误差

八、普通/混杂函数
    1.极端测试:
      1)  函数 IsNan(const AValue: Double): Boolean; overload;
      比如infinity, NaN 双精度值有7FF指数, 而且NaN 值有不为0的分数域
      2)  函数 IsNan(const AValue: Single): Boolean; overload;
      3)  函数 IsNan(const AValue: Extended): Boolean; overload;
      4)  函数 IsInfinite(const AValue: Double): Boolean;
          比如 NaN, 一个infinity 双精度值有一个7FF指数, 但是infinity 值有一个0分数域(have a fraction field of 0)。Infinity 值能够在最高符号位被指定为正数或负数

    2.简单符号测试
      type
        TValueSign = -1..1;
      const
        NegativeValue = Low(TValueSign);
        ZeroValue = 0;
      PositiveValue = High(TValueSign);
      1)  函数 Sign(const AValue: Integer): TValueSign; overload;
      2)  函数 Sign(const AValue: Int64): TValueSign; overload;
      3)  函数 Sign(const AValue: Double): TValueSign; overload;

    3.浮点数比较
      CompareFloat 和 SameFloa)如果epsilon没有给出或者是0,那将试图以一个当前浮点数类型相匹配的误差来计算比较。
      1)  函数 CompareValue(const A, B: Extended; Epsilon: Extended = 0): TValueRelationship; overload;
      2)  函数 CompareValue(const A, B: Double; Epsilon: Double = 0): TValueRelationship; overload;
      3)  函数 CompareValue(const A, B: Single; Epsilon: Single = 0): TValueRelationship; overload;
      4)  函数 CompareValue(const A, B: Integer): TValueRelationship; overload;
      5)  函数 CompareValue(const A, B: Int64): TValueRelationship; overload;
      6)  函数 SameValue(const A, B: Extended; Epsilon: Extended = 0): Boolean; overload;
      7)  函数 SameValue(const A, B: Double; Epsilon: Double = 0): Boolean; overload;
      8)  函数 SameValue(const A, B: Single; Epsilon: Single = 0): Boolean; overload;

    4.零测试
      IsZero: 若值为0(或者是非常非常接近于0)则返回“真”
      1)  函数 IsZero(const A: Extended; Epsilon: Extended = 0): Boolean; overload;
      2)  函数 IsZero(const A: Double; Epsilon: Double = 0): Boolean; overload;
      3)  函数 IsZero(const A: Single; Epsilon: Single = 0): Boolean; overload;

    5.  简单易用的条件函数
      1)  函数 IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer = 0): Integer; overload;
      2)  函数 IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64 = 0): Int64; overload;
      3)  函数 IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double = 0.0): Double; overload;

    6.  各种随机函数
      1)  函数 RandomRange(const AFrom, ATo: Integer): Integer;
      2)  函数 RandomFrom(const AValues: array of Integer): Integer; overload;
      3)  函数 RandomFrom(const AValues: array of Int64): Int64; overload;
      4)  函数 RandomFrom(const AValues: array of Double): Double; overload;

    7.  范围测试函数
      1)  函数 InRange(const AValue, AMin, AMax: Integer): Boolean; overload;
      2)  函数 InRange(const AValue, AMin, AMax: Int64): Boolean; overload;
      3)  函数 InRange(const AValue, AMin, AMax: Double): Boolean; overload;

    8.  范围切断函数
      1)  函数 EnsureRange(const AValue, AMin, AMax: Integer): Integer; overload;
      2)  函数 EnsureRange(const AValue, AMin, AMax: Int64): Int64; overload;
      3)  函数 EnsureRange(const AValue, AMin, AMax: Double): Double; overload;

    9.  16位整数除法一次调用得出结果和余数
      1)  过程 DivMod(Dividend: Integer; Divisor: Word; var Result, Remainder: Word);

    10. 圆整到特殊数字或10的幂
      ADigit 在37 到-37范围之中,下面是一些示例
       3 = 10^3  = 1000   = thousand's place
       2 = 10^2  =  100   = hundred's place
       1 = 10^1  =   10   = ten's place
      -1 = 10^-1 = 1/10   = tenth's place
      -2 = 10^-2 = 1/100  = hundredth's place
      -3 = 10^-3 = 1/1000 = thousandth's place }

      type
       TRoundToRange = -37..37;
      1)函数 RoundTo(const AValue: Double; const ADigit: TRoundToRange): Double;
        RoundTo函数的变量遵循不对称算术舍入运算法则(如果Frac(X) < 0.5则返回X否则返回X+1)。其缺省凑整到1/100。
      2)函数 SimpleRoundTo(const AValue: Double; const ADigit: TRoundToRange = -2): Double;

九、金融函数
    遵循Quattro Pro标准,参数约定概念。金钱收入为正,金钱支出为负 (举例来说,借款人偿还贷款则借款人为负)。利率是有支付周期,11%的年度利率,相当于每个月(11 / 100) / 12 = 0.00916667
    type
      TPaymentTime = (ptEndOfPeriod, ptStartOfPeriod);
    1) 函数 DoubleDecliningBalance(const Cost, Salvage: Extended; Life, Period: Integer): Extended;
      { Double Declining Balance (DDB) }

    2) 函数 FutureValue(const Rate: Extended; NPeriods: Integer; const Payment, PresentValue: Extended; PaymentTime: TPaymentTime): Extended;
    未来值(终值(FVAL))

    3) 函数 InterestPayment(const Rate: Extended; Period, NPeriods: Integer; const PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
    利息收入(IPAYMT)

    4) 函数 InterestRate(NPeriods: Integer; const Payment, PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
    利率(IRATE)

    5) 函数 InternalRateOfReturn(const Guess: Extended; const CashFlows: array of Double): Extended;
    内部盈利率(利润率)(Internal Rate of Return. (IRR))需要现金流数组

    6) 函数 NumberOfPeriods(const Rate: Extended; Payment: Extended; const PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
    周期数{ Number of Periods (NPER) }

    7) 函数 NetPresentValue(const Rate: Extended; const CashFlows: array of Double; PaymentTime: TPaymentTime): Extended;
    现在净价值,纯现值(Net Present Value. (NPV),需要现金流数组

    8) 函数 Payment(Rate: Extended; NPeriods: Integer; const PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
    支出 { Payment (PAYMT) }

    9) 函数 PeriodPayment(const Rate: Extended; Period, NPeriods: Integer; const PresentValue, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
    支付周期{ Period Payment (PPAYMT) }

    10) 函数 PresentValue(const Rate: Extended; NPeriods: Integer; const Payment, FutureValue: Extended; PaymentTime: TPaymentTime): Extended;
    现值{ Present Value (PVAL) }

    11) 函数 SLNDepreciation(const Cost, Salvage: Extended; Life: Integer): Extended;
    直线折旧{ Straight Line depreciation (SLN) }

    12) 函数 SYDDepreciation(const Cost, Salvage: Extended; Life, Period: Integer): Extended;
    折旧{ Sum-of-Years-Digits depreciation (SYD) }

十、FPU 异常/精度/舍入管理
    以下函数允许你控制FPU行为。控制FPU异常处理,FPU默认精度设置,FPU怎样舍入控制
    type
    TFPURoundingMode = (rmNearest, rmDown, rmUp, rmTruncate);
    1) 函数 GetRoundMode: TFPURoundingMode; 返回当前舍入模式
    2) 函数 SetRoundMode(const RoundMode: TFPURoundingMode): TFPURoundingMode;
    设置新的舍入模式并且返回旧的模式

    type
      TFPUPrecisionMode = (pmSingle, pmReserved, pmDouble, pmExtended);
    3) 函数 GetPrecisionMode: TFPUPrecisionMode; 返回当前精度控制模式
    4) 函数 SetPrecisionMode(const Precision: TFPUPrecisionMode): TFPUPrecisionMode;
    设置新的精度控制模式并且返回旧的模式

    type
      TFPUException = (exInvalidOp, exDenormalized, exZeroDivide,
                       exOverflow, exUnderflow, exPrecision);
      TFPUExceptionMask = set of TFPUException;
    掩码中任何元素设置防止FPU产生各种异常。它企图返回一个最好的数值,经常是NaN 或 infinity。数值依靠运算和当前的舍入模式

    5) 函数 GetExceptionMask: TFPUExceptionMask;
    从控制字中返回异常掩码

    6) 函数 SetExceptionMask(const Mask: TFPUExceptionMask): TFPUExceptionMask;
    设置新的异常掩码并返回旧的

    7) 过程 ClearExceptions(RaisePending: Boolean = True);
    清除状态字中任何未定的异常位

posted @ 2006-06-25 19:21  小洋房  阅读(1538)  评论(0)    收藏  举报