--- a/Number.st Mon May 09 16:44:54 2016 +0200
+++ b/Number.st Mon May 09 16:52:17 2016 +0200
@@ -2468,70 +2468,96 @@
arcCos
"return the arccosine of the receiver (in radians)"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcCos.
].
+ "/ slow fallback
^ (self class pi / 2) - self arcSin
!
arcCosech
"return the inverse hyperbolic cosecant of the receiver."
-
+ "caveat: misnomer; should be called aCosech or arCosech"
+
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcCosech.
].
+ "/ slow fallback
^ ((1 + ((self*self)+1) sqrt) / self) ln
!
arcCosh
"return the inverse hyperbolic cosine of the receiver."
-
+ "caveat: misnomer; should be called aCosh or arCosh"
+
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcCosh.
].
+ "/ slow fallback
^ (self + (self*self-1) sqrt) ln.
!
arcCoth
"return the inverse hyperbolic cotangent of the receiver."
-
+ "caveat: misnomer; should be called aCoth or arCoth"
+
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcCoth.
].
+ "/ slow fallback
^ ((self+1) / (self-1)) ln / 2
!
arcSech
"return the inverse hyperbolic secant of the receiver."
-
+ "caveat: misnomer; should be called aSech or arSech"
+
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcSech.
].
+ "/ slow fallback
^ ((1 + (1-(self*self)) sqrt) / self) ln
!
arcSin
"return the arcsine of the receiver (in radians)"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcSin.
].
+ "/ very slow fallback
^ self arcSin_withAccuracy:self epsilon
!
arcSinh
"return the inverse hyperbolic sine of the receiver."
-
+ "caveat: misnomer; should be called aSinh or arSinh"
+
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcSinh.
].
+ "/ slow fallback
^ ( self + (self*self+1) sqrt ) ln
"/ ^ self arcSinh_withAccuracy:self epsilon
!
@@ -2539,30 +2565,40 @@
arcTan
"return the arctangent of the receiver (as radians)"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcTan.
].
+ "/ very slow fallback
^ self arcTan_withAccuracy:self epsilon
!
arcTan2:x
"return atan2(self,x) (as radians)"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcTan2:x.
].
+ "/ very slow fallback
^ self arcTan2_withAccuracy:self epsilon x:x
!
arcTanh
"return the inverse hyperbolic tangent of the receiver."
-
+ "caveat: misnomer; should be called aTanh or arTanh"
+
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat arcTanh.
].
+ "/ slow fallback
^ ((1 + self) / (1 - self)) ln / 2
"/ s^ ((1 + self) ln / 2) - ((1 - self) ln / 2)
!
@@ -2570,20 +2606,26 @@
cos
"return the cosine of the receiver (interpreted as radians)"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat cos.
].
+ "/ very slow fallback
^ self cos_withAccuracy:self epsilon
!
cosh
"return the hyperbolic cosine of the receiver"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat cosh.
].
+ "/ very slow fallback
^ self cosh_withAccuracy:self epsilon
!
@@ -2596,6 +2638,8 @@
sin
"return the sine of the receiver (interpreted as radians)"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat sin.
@@ -2606,6 +2650,8 @@
sinh
"return the hyperbolic sine of the receiver"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat sinh.
@@ -2616,16 +2662,20 @@
tan
"return the tangens of the receiver (interpreted as radians)"
+ "/ slow fallback
^ self sin / self cos
!
tanh
"return the hyperbolic tangens of the receiver"
+ "/ if I am not a Float (or a less general lpReal),
+ "/ retry after converting to float
(self isLimitedPrecisionReal not
or:[self generality < 1.0 generality]) ifTrue:[
^ self asFloat tanh.
].
+ "/ very slow fallback
^ self tanh_withAccuracy:self epsilon
"/ If a fast exp is available, the following might be better...