Pārlūkot izejas kodu

* lnxp1 function fixed to be accurate near zero argument values, using code from AMath library by Wolfgang Ehrhardt.

git-svn-id: trunk@26084 -
sergei 11 gadi atpakaļ
vecāks
revīzija
5206584805
1 mainītis faili ar 13 papildinājumiem un 4 dzēšanām
  1. 13 4
      rtl/objpas/math.pp

+ 13 - 4
rtl/objpas/math.pp

@@ -309,7 +309,7 @@ function log10(x : float) : float;
 function log2(x : float) : float;
 function logn(n,x : float) : float;
 
-{ returns natural logarithm of x+1 }
+{ returns natural logarithm of x+1, accurate for x values near zero }
 function lnxp1(x : float) : float;
 
 { exponential functions }
@@ -871,10 +871,19 @@ function logn(n,x : float) : float;
   end;
 
 function lnxp1(x : float) : float;
+  var
+    y: float;
   begin
-     if x<-1 then
-       InvalidArgument;
-     lnxp1:=ln(1+x);
+    if (x>=4.0) then
+      lnxp1:=ln(1.0+x)
+    else
+      begin
+        y:=1.0+x;
+        if (y=1.0) then
+          lnxp1:=x
+        else
+          lnxp1:=ln(y)+(x-(y-1.0))/y;
+      end;
   end;
 
 function power(base,exponent : float) : float;