Browse Source

* patch by Bart B: Implement sinh(), cosh() and tanh() for single, double and extended parameters, resolves #40083

florian 2 năm trước cách đây
mục cha
commit
96eb5da939
1 tập tin đã thay đổi với 112 bổ sung11 xóa
  1. 112 11
      rtl/objpas/math.pp

+ 112 - 11
rtl/objpas/math.pp

@@ -431,9 +431,36 @@ function ArcTan2(y,x : float) : float;
 
 { hyperbolic functions }
 
-function CosH(x : float) : float;
-function SinH(x : float) : float;
-function TanH(x : float) : float;
+{$ifdef FPC_HAS_TYPE_SINGLE}
+function cosh(x : Single) : Single;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_DOUBLE}
+function cosh(x : Double) : Double;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_EXTENDED}
+function cosh(x : Extended) : Extended;
+{$ENDIF}
+
+{$ifdef FPC_HAS_TYPE_SINGLE}
+function sinh(x : Single) : Single;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_DOUBLE}
+function sinh(x : Double) : Double;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_EXTENDED}
+function sinh(x : Extended) : Extended;
+{$ENDIF}
+
+{$ifdef FPC_HAS_TYPE_SINGLE}
+function tanh(x : Single) : Single;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_DOUBLE}
+function tanh(x : Double) : Double;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_EXTENDED}
+function tanh(x : Extended) : Extended;
+{$ENDIF}
+
 {$ifdef FPC_HAS_TYPE_SINGLE}
 function SecH(const X: Single): Single;
 {$ENDIF}
@@ -1220,30 +1247,72 @@ function arctan2(y,x : float) : float;
   end;
 {$endif FPC_MATH_HAS_ARCTAN2}
 
-
-function cosh(x : float) : float;
+{$ifdef FPC_HAS_TYPE_SINGLE}
+function cosh(x : Single) : Single;
   var
-     temp : float;
+     temp : ValReal;
   begin
      temp:=exp(x);
      cosh:=0.5*(temp+1.0/temp);
   end;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_DOUBLE}
+function cosh(x : Double) : Double;
+  var
+     temp : ValReal;
+  begin
+     temp:=exp(x);
+     cosh:=0.5*(temp+1.0/temp);
+  end;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_EXTENDED}
+function cosh(x : Extended) : Extended;
+  var
+     temp : Extended;
+  begin
+     temp:=exp(x);
+     cosh:=0.5*(temp+1.0/temp);
+  end;
+{$ENDIF}
 
-function sinh(x : float) : float;
+{$ifdef FPC_HAS_TYPE_SINGLE}
+function sinh(x : Single) : Single;
   var
-     temp : float;
+     temp : ValReal;
   begin
      temp:=exp(x);
      { copysign ensures that sinh(-0.0)=-0.0 }
      sinh:=copysign(0.5*(temp-1.0/temp),x);
   end;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_DOUBLE}
+function sinh(x : Double) : Double;
+  var
+     temp : ValReal;
+  begin
+     temp:=exp(x);
+     { copysign ensures that sinh(-0.0)=-0.0 }
+     sinh:=copysign(0.5*(temp-1.0/temp),x);
+  end;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_EXTENDED}
+function sinh(x : Extended) : Extended;
+  var
+     temp : Extended;
+  begin
+     temp:=exp(x);
+     { copysign ensures that sinh(-0.0)=-0.0 }
+     sinh:=copysign(0.5*(temp-1.0/temp),x);
+  end;
+{$ENDIF}
 
-function tanh(x : float) : float;
+{$ifdef FPC_HAS_TYPE_SINGLE}
+function tanh(x : Single) : Single;
   var
-    tmp:float;
+    tmp:ValReal;
   begin
     if x < 0 then begin
-      tmp:=exp(2*x); 
+      tmp:=exp(2*x);
       result:=(tmp-1)/(1+tmp)
     end
     else begin
@@ -1251,6 +1320,38 @@ function tanh(x : float) : float;
       result:=(1-tmp)/(1+tmp)
     end;
   end;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_DOUBLE}
+function tanh(x : Double) : Double;
+  var
+    tmp:ValReal;
+  begin
+    if x < 0 then begin
+      tmp:=exp(2*x);
+      result:=(tmp-1)/(1+tmp)
+    end
+    else begin
+      tmp:=exp(-2*x);
+      result:=(1-tmp)/(1+tmp)
+    end;
+  end;
+{$ENDIF}
+{$ifdef FPC_HAS_TYPE_EXTENDED}
+function tanh(x : Extended) : Extended;
+  var
+    tmp:Extended;
+  begin
+    if x < 0 then begin
+      tmp:=exp(2*x);
+      result:=(tmp-1)/(1+tmp)
+    end
+    else begin
+      tmp:=exp(-2*x);
+      result:=(1-tmp)/(1+tmp)
+    end;
+  end;
+{$ENDIF}
+
 
 {$ifdef FPC_HAS_TYPE_SINGLE}
 function SecH(const X: Single): Single;