Draft of missing functions in Complex

Martin Snelgrove snelgar at dissonance.com
Fri Sep 30 06:03:42 UTC 2005


The documentation for Kernel-Numbers/Complex says that arcSin, arcCos  
and arcTan are missing. "sqrt" is
also handy for implementing some of these.

Following are versions of these functions, plus a cut-and-paste set  
of manual tests from a Workspace. I'm new to
Smalltalk, so there are certainly lots more parentheses than  
necessary, plus I'm sure lots of other style failures.
There will also be lots of numerical and efficiency improvements  
possible. I hope the functions provide a start, though.

sqrt
     "complex square root: principal value taken as upper half-plane"
     | |
     imaginary = 0.0 ifTrue:
         [real >= 0.0 ifTrue:
             [^real sqrt]
                         ifFalse:
             [^real negated sqrt * 1 i]
         ].
     ^ (0.5 * (self ln)) exp.



arcSin
     "analytic continuation of inverse sine function"
     |  |
     ^ ((self * 1 i) + (1 - (self squared)) sqrt) ln * (-1 i).


arcCos
     "inverse of cosine function extended to Complex"
     | |
     ^ (self + ((self squared - 1) sqrt)) ln * -1 i .


arcTan
     "inverse of tan on the complex domain"
     | iself |
     iself := 1 i * self.
      ^ 0.5 i *  ((1.0 - iself) / (1.0 + iself)) ln.


Here are some simple tests, copied & pasted from Workspace:

Transcript clear.
{ 0 . 0 + 0i . 1 . 1 + 0 i . 3 + 4 i . 1.3 + 4 i . 1 i . -1 i .} do:  
[: z |
     Transcript
         show: 'z = '; show: z ;
         show: '  z sqrt ='; show: z sqrt ;
         show: '  z arcSin = '; show: z arcSin;
         show: '  z arcSin sin = '; show: z arcSin sin;
         show: '  z sin arcSin = '; show: z sin arcSin;
         show: '  z arcCos = '; show: z arcCos;
         show: '  z arcCos cos = '; show: z arcCos cos;
         show: '  z cos arcCos = '; show: z cos arcCos;
         show: String crlfcrlf].

And the results are:

z = 0  z sqrt =0.0  z arcSin = 0.0  z arcSin sin = 0.0  z sin arcSin  
= 0.0  z arcCos = 1.570796326794897  z arcCos cos =  
1.224646799147353e-16  z cos arcCos = 0.0

z = 0 + 0 i  z sqrt =0.0  z arcSin = 0.0 + 0.0 i  z arcSin sin = 0.0  
+ 0.0 i  z sin arcSin = 0.0 + 0.0 i  z arcCos = 1.570796326794897 +  
0.0 i  z arcCos cos = 6.12323399573677e-17 + 0.0 i  z cos arcCos =  
0.0 + 0.0 i

z = 1  z sqrt =1.0  z arcSin = 1.570796326794897  z arcSin sin = 1.0   
z sin arcSin = 1.0  z arcCos = 0.0  z arcCos cos = 1.0  z cos arcCos  
= 1.0

z = 1 + 0 i  z sqrt =1.0  z arcSin = 1.570796326794897 + 0.0 i  z  
arcSin sin = 1.0 - 6.12323399573677e-17 i  z sin arcSin = 1.0 + 0.0  
i  z arcCos = 0.0 + 0.0 i  z arcCos cos = 1.0 + 0.0 i  z cos arcCos =  
1.0 + 1.110223024625156e-16 i

z = 3 + 4 i  z sqrt =2.0 + 1.0 i  z arcSin = 0.633983865639184 +  
2.305509031243485 i  z arcSin sin = 3.000000000000056 +  
4.00000000000001 i  z sin arcSin = 0.1415926535897932 - 4.0 i  z  
arcCos = 0.93681246115572 - 2.305509031243477 i  z arcCos cos = 3.0 +  
4.0 i  z cos arcCos = 2.999999999999935 + 4.00000000000009 i

z = 1.3 + 4 i  z sqrt =1.659208873072136 + 1.205393746657626 i  z  
arcSin = 0.306199697879277 + 2.14098384538913 i  z arcSin sin =  
1.299999999999996 + 3.999999999999993 i  z sin arcSin =  
1.300000000000133 + 3.99999999999994 i  z arcCos = 1.264596628915619  
- 2.140983845389134 i  z arcCos cos = 1.3 + 4.0 i  z cos arcCos =  
-1.3 - 4.0 i

z = 0 + 1 i  z sqrt =0.7071067811865475 + 0.7071067811865475 i  z  
arcSin = 0.0 + 0.881373587019543 i  z arcSin sin = 0.0 + 1.0 i  z sin  
arcSin = 0.0 + 1.0 i  z arcCos = 1.570796326794897 -  
0.881373587019543 i  z arcCos cos = 1.47827945580917e-16 + 1.0 i  z  
cos arcCos = 0.0 - 1.0 i

z = 0 - 1 i  z sqrt =0.7071067811865475 - 0.7071067811865475 i  z  
arcSin = 0.0 - 0.881373587019543 i  z arcSin sin = 0.0 - 1.0 i  z sin  
arcSin = 0.0 - 1.0 i  z arcCos = 1.570796326794897 +  
0.881373587019543 i  z arcCos cos = 2.536326566618168e-17 - 1.0 i  z  
cos arcCos = 0.0 - 1.0 i

Note that these functions aren't one-to-one, so "z sin arcsin" isn't  
necessarily the identity. The real part can take jumps of multiples  
of Pi,
signs can change, etcetera. For example, note:
(3 + 4 i) sin arcSin                          -> 0.1415926535897932 -  
4.0 i
(3 + 4 i) sin arcSin sin arcSin       -> 0.1415926535897932 - 4.0 i
The first time through, "sin arcSin" jumps branches; after that it's  
the identity.








More information about the Squeak-dev mailing list