Complex.st
author Claus Gittinger <cg@exept.de>
Tue, 28 Jan 1997 01:02:13 +0100
changeset 2292 e1c0e8ada72f
parent 1944 9fb0b642d2ca
child 3633 89f1f31527f4
permissions -rw-r--r--
can wait forEver, if there is nothing to do
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
     1
"{ Package: 'goodies/Numeric-Complex' }"
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
     2
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
     3
'From Smalltalk-80, Version 2.4 of 28 January 1989 on 14 May 1989 at 2:48:01 pm'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
     4
f014922e3b71 Initial revision
claus
parents:
diff changeset
     5
ArithmeticValue subclass: #Complex
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
     6
	instanceVariableNames: 'real imaginary '
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
     7
	classVariableNames: ''
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
     8
	poolDictionaries: ''
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
     9
	category: 'Magnitude-Numbers'
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    10
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    11
f014922e3b71 Initial revision
claus
parents:
diff changeset
    12
Complex comment:
f014922e3b71 Initial revision
claus
parents:
diff changeset
    13
'This is an implementation of complex numbers.  A complex number has real and
f014922e3b71 Initial revision
claus
parents:
diff changeset
    14
 imaginary parts which must be manipulated simultaneously in any numeric processing.
f014922e3b71 Initial revision
claus
parents:
diff changeset
    15
  Complex numbers can be used in many of the same places that regular numbers
f014922e3b71 Initial revision
claus
parents:
diff changeset
    16
 can be used with one major exception of comparisons, since complex numbers cannot
f014922e3b71 Initial revision
claus
parents:
diff changeset
    17
 be directly compared for size (except through lengths of vectors (see absolute
f014922e3b71 Initial revision
claus
parents:
diff changeset
    18
 value)).
f014922e3b71 Initial revision
claus
parents:
diff changeset
    19
f014922e3b71 Initial revision
claus
parents:
diff changeset
    20
Instance variables:
f014922e3b71 Initial revision
claus
parents:
diff changeset
    21
    real        <Number> the part of the number which can be expressed as a Real number
f014922e3b71 Initial revision
claus
parents:
diff changeset
    22
    imaginary   <Number> the part of the number which, in terms of how the number behaves,
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    23
			 has been multiplied by ''i'' (-1 sqrt)
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    24
f014922e3b71 Initial revision
claus
parents:
diff changeset
    25
Author: Kurt Hebel (hebel@uinova.cerl.uiuc.edu)'
f014922e3b71 Initial revision
claus
parents:
diff changeset
    26
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    27
f014922e3b71 Initial revision
claus
parents:
diff changeset
    28
!Complex methodsFor: 'accessing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    29
f014922e3b71 Initial revision
claus
parents:
diff changeset
    30
imaginary
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    31
	"Return the imaginary part of the complex number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    32
	^ imaginary
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    33
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    34
f014922e3b71 Initial revision
claus
parents:
diff changeset
    35
real
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    36
	"Return the real part of the complex number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    37
	^ real
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    38
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
    39
f014922e3b71 Initial revision
claus
parents:
diff changeset
    40
!Complex methodsFor: 'arithmetic'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    41
f014922e3b71 Initial revision
claus
parents:
diff changeset
    42
* aNumber 
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    43
	"Return the product of the receiver and the argument."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    44
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    45
	| u v |
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    46
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    47
	aNumber isComplex ifTrue:[
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    48
	    u := aNumber real.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    49
	    v := aNumber imaginary.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    50
	    ^Complex real: real * u - (imaginary * v)
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    51
		     imaginary: real * v + (imaginary * u)
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    52
	].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    53
	^self retry: #* coercing: aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    54
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    55
f014922e3b71 Initial revision
claus
parents:
diff changeset
    56
+ aNumber 
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    57
	"Return the sum of the receiver and the argument."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    58
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    59
	aNumber isComplex ifTrue: [
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    60
	    ^Complex real: aNumber real + real
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    61
		     imaginary: aNumber imaginary + imaginary
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    62
	].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    63
	^self retry: #+ coercing: aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    64
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    65
f014922e3b71 Initial revision
claus
parents:
diff changeset
    66
- aNumber
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    67
	"Return the difference of the receiver and the argument."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    68
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    69
	aNumber isComplex ifTrue: [
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    70
	    ^Complex real: real - aNumber real
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    71
		     imaginary: imaginary - aNumber imaginary
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    72
	].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    73
	^self retry: #- coercing: aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    74
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    75
f014922e3b71 Initial revision
claus
parents:
diff changeset
    76
/ aNumber 
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    77
	"Return the quotient of the receiver and the argument."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    78
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    79
	| denom u v |
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    80
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    81
	aNumber isComplex ifTrue:[ 
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    82
	    u := aNumber real.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    83
	    v := aNumber imaginary.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    84
	    denom := u * u + (v * v).
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    85
	    ^Complex real: u * real + (v * imaginary) / denom
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    86
		     imaginary: u * imaginary - (v * real) / denom
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    87
	].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    88
	^self retry: #/ coercing: aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    89
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    90
f014922e3b71 Initial revision
claus
parents:
diff changeset
    91
abs
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    92
	"Return the magnitude (or absolute value) of the complex number."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    93
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    94
	^ (real * real + (imaginary * imaginary)) sqrt
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    95
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
    96
f014922e3b71 Initial revision
claus
parents:
diff changeset
    97
conjugated
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
    98
	"Return the complex conjugate of this complex number."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
    99
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   100
	^ Complex real: real imaginary: imaginary negated
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   101
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   102
f014922e3b71 Initial revision
claus
parents:
diff changeset
   103
!Complex methodsFor: 'double dispatching'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   104
f014922e3b71 Initial revision
claus
parents:
diff changeset
   105
differenceFromFloat: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   106
	^ argument asComplex - self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   107
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   108
f014922e3b71 Initial revision
claus
parents:
diff changeset
   109
differenceFromFraction: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   110
	^ argument asComplex - self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   111
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   112
f014922e3b71 Initial revision
claus
parents:
diff changeset
   113
differenceFromInteger: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   114
	^ argument asComplex - self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   115
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   116
f014922e3b71 Initial revision
claus
parents:
diff changeset
   117
productFromFloat: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   118
	^ argument asComplex * self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   119
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   120
f014922e3b71 Initial revision
claus
parents:
diff changeset
   121
productFromFraction: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   122
	^ argument asComplex * self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   123
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   124
f014922e3b71 Initial revision
claus
parents:
diff changeset
   125
productFromInteger: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   126
	^ argument asComplex * self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   127
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   128
f014922e3b71 Initial revision
claus
parents:
diff changeset
   129
quotientFromFloat: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   130
	^ argument asComplex / self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   131
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   132
f014922e3b71 Initial revision
claus
parents:
diff changeset
   133
quotientFromFraction: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   134
	^ argument asComplex / self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   135
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   136
f014922e3b71 Initial revision
claus
parents:
diff changeset
   137
quotientFromInteger: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   138
	^ argument asComplex / self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   139
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   140
f014922e3b71 Initial revision
claus
parents:
diff changeset
   141
sumFromFloat: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   142
	^ argument asComplex + self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   143
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   144
f014922e3b71 Initial revision
claus
parents:
diff changeset
   145
sumFromFraction: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   146
	^ argument asComplex + self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   147
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   148
f014922e3b71 Initial revision
claus
parents:
diff changeset
   149
sumFromInteger: argument
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   150
	^ argument asComplex + self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   151
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   152
f014922e3b71 Initial revision
claus
parents:
diff changeset
   153
!Complex methodsFor: 'mathematical functions'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   154
f014922e3b71 Initial revision
claus
parents:
diff changeset
   155
angle
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   156
	"Return the radian angle for this Complex number."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   157
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   158
	real < 0 ifTrue: [
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   159
	    imaginary < 0 ifTrue: [
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   160
		^ (imaginary / real) arcTan - Float pi
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   161
	    ].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   162
	    ^ Float pi + (imaginary / real) arcTan
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   163
	].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   164
	^ (imaginary / real) arcTan
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   165
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   166
f014922e3b71 Initial revision
claus
parents:
diff changeset
   167
exp
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   168
	"Return the complex exponential of the receiver."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   169
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   170
	^ imaginary cos % imaginary sin * real exp
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   171
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   172
f014922e3b71 Initial revision
claus
parents:
diff changeset
   173
sqrt
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   174
	"Return the square root of the receiver"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   175
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   176
	| u v |
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   177
	(imaginary = 0 and: [real >= 0]) ifTrue: [^real sqrt].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   178
	v := (self abs - real / 2) sqrt.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   179
	u := imaginary / 2 / v.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   180
	^Complex real: u imaginary: v
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   181
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   182
	"-4 asComplex sqrt"
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   183
	"-4 asComplex sqrt squared"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   184
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   185
f014922e3b71 Initial revision
claus
parents:
diff changeset
   186
!Complex methodsFor: 'comparing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   187
f014922e3b71 Initial revision
claus
parents:
diff changeset
   188
= aNumber
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   189
	^ (aNumber real = real) and:[aNumber imaginary = imaginary]
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   190
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   191
f014922e3b71 Initial revision
claus
parents:
diff changeset
   192
< aNumber
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   193
	^Number
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   194
		raise: #unorderedSignal
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   195
		receiver: self
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   196
		selector: #<
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   197
		arg: aNumber
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   198
		errorString: 'Complex numbers are not well ordered'!
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   199
f014922e3b71 Initial revision
claus
parents:
diff changeset
   200
hash
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   201
	"Hash is implemented because equals is implemented."
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   202
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   203
	^ real hash
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   204
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   205
f014922e3b71 Initial revision
claus
parents:
diff changeset
   206
!Complex methodsFor: 'testing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   207
f014922e3b71 Initial revision
claus
parents:
diff changeset
   208
isComplex
f014922e3b71 Initial revision
claus
parents:
diff changeset
   209
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   210
	^true
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   211
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   212
f014922e3b71 Initial revision
claus
parents:
diff changeset
   213
isReal
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   214
	"Return true if this Complex number has a zero imaginary part."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   215
	^ imaginary = 0
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   216
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   217
f014922e3b71 Initial revision
claus
parents:
diff changeset
   218
isZero
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   219
	"Answer whether 'self = self class zero'.  We can't use #= because
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   220
	#= is defined in terms of #isZero"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   221
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   222
	^real isZero and: [imaginary isZero]
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   223
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   224
f014922e3b71 Initial revision
claus
parents:
diff changeset
   225
sign
f014922e3b71 Initial revision
claus
parents:
diff changeset
   226
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   227
	^Complex real: real sign imaginary: imaginary sign
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   228
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   229
f014922e3b71 Initial revision
claus
parents:
diff changeset
   230
!Complex methodsFor: 'coercing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   231
f014922e3b71 Initial revision
claus
parents:
diff changeset
   232
coerce: aNumber
f014922e3b71 Initial revision
claus
parents:
diff changeset
   233
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   234
	^aNumber asComplex
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   235
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   236
f014922e3b71 Initial revision
claus
parents:
diff changeset
   237
generality
f014922e3b71 Initial revision
claus
parents:
diff changeset
   238
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   239
	^150
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   240
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   241
f014922e3b71 Initial revision
claus
parents:
diff changeset
   242
!Complex methodsFor: 'converting'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   243
f014922e3b71 Initial revision
claus
parents:
diff changeset
   244
asComplex
f014922e3b71 Initial revision
claus
parents:
diff changeset
   245
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   246
	^self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   247
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   248
f014922e3b71 Initial revision
claus
parents:
diff changeset
   249
asFloat
f014922e3b71 Initial revision
claus
parents:
diff changeset
   250
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   251
	imaginary = 0 ifTrue: [^real asFloat].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   252
	^Number
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   253
		raise: #coercionErrorSignal
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   254
		receiver: self
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   255
		selector: #asFloat
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   256
		errorString: 'Can''t coerce an instance of Complex to a Float'
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   257
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   258
f014922e3b71 Initial revision
claus
parents:
diff changeset
   259
asInteger
f014922e3b71 Initial revision
claus
parents:
diff changeset
   260
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   261
	imaginary = 0 ifTrue: [^real asInteger].
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   262
	^Number
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   263
		raise: #coercionErrorSignal
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   264
		receiver: self
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   265
		selector: #asInteger
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   266
		errorString: 'Can''t coerce an instance of Complex to an Integer'
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   267
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   268
f014922e3b71 Initial revision
claus
parents:
diff changeset
   269
asPoint
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   270
	"Return the complex number as a point."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   271
	^ real @ imaginary
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   272
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   273
f014922e3b71 Initial revision
claus
parents:
diff changeset
   274
reduceGeneralityIfPossible
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   275
	"Answer the receiver transformed to a lower generality, if such a 
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   276
	transformation is possible without losing information. If not, answer 
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   277
	the receiver"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   278
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   279
	imaginary isZero
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   280
		ifTrue: [^real]
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   281
		ifFalse: [^self]
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   282
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   283
f014922e3b71 Initial revision
claus
parents:
diff changeset
   284
!Complex methodsFor: 'printing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   285
f014922e3b71 Initial revision
claus
parents:
diff changeset
   286
printString
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   287
	^ '(' , real printString, '%', imaginary printString, ')'
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   288
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   289
f014922e3b71 Initial revision
claus
parents:
diff changeset
   290
printOn: aStream
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   291
	aStream nextPut: $(.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   292
	real storeOn: aStream.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   293
	aStream nextPutAll: '%'.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   294
	imaginary storeOn: aStream.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   295
	aStream nextPut: $).
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   296
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   297
f014922e3b71 Initial revision
claus
parents:
diff changeset
   298
storeOn: aStream
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   299
	aStream nextPut: $(.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   300
	real storeOn: aStream.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   301
	aStream nextPutAll: '%'.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   302
	imaginary storeOn: aStream.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   303
	aStream nextPut: $).
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   304
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   305
f014922e3b71 Initial revision
claus
parents:
diff changeset
   306
!Complex methodsFor: 'private'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   307
f014922e3b71 Initial revision
claus
parents:
diff changeset
   308
setReal: u setImaginary: v
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   309
	real := u.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   310
	imaginary := v.
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   311
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   312
f014922e3b71 Initial revision
claus
parents:
diff changeset
   313
f014922e3b71 Initial revision
claus
parents:
diff changeset
   314
!Complex class methodsFor: 'instance creation'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   315
f014922e3b71 Initial revision
claus
parents:
diff changeset
   316
fromReal: aNumber
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   317
	"Create a new complex number from the given real number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   318
	^ self basicNew setReal: aNumber setImaginary: 0
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   319
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   320
f014922e3b71 Initial revision
claus
parents:
diff changeset
   321
real: u imaginary: v
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   322
	"Create a new complex number with the given real and imaginary parts.  If the
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   323
	 imaginary part is zero, return the real part of the number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   324
	^v = 0 ifTrue: [u]
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   325
	       ifFalse: [self basicNew setReal: u setImaginary: v]
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   326
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   327
f014922e3b71 Initial revision
claus
parents:
diff changeset
   328
!Complex class methodsFor: 'exception handling'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   329
f014922e3b71 Initial revision
claus
parents:
diff changeset
   330
trapImaginary: aBlock
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   331
	"Complex trapImaginary: [-27 sqrt]"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   332
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   333
	| send |
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   334
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   335
	^Number domainErrorSignal handle: [ :ex |
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   336
	    send := ex parameter.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   337
	    (send selector = #sqrt or: [send selector = #sqrtTruncated]) ifTrue: [
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   338
		send receiver: send receiver asComplex.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   339
		ex proceedWith: send value
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   340
	    ] ifFalse: [
f014922e3b71 Initial revision
claus
parents:
diff changeset
   341
		ex reject
f014922e3b71 Initial revision
claus
parents:
diff changeset
   342
	    ]
f014922e3b71 Initial revision
claus
parents:
diff changeset
   343
	] do: aBlock
f014922e3b71 Initial revision
claus
parents:
diff changeset
   344
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   345
f014922e3b71 Initial revision
claus
parents:
diff changeset
   346
!Complex class methodsFor: 'constants access'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   347
f014922e3b71 Initial revision
claus
parents:
diff changeset
   348
unity
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   349
	"Answer the value which allows, for any given arithmetic value, the following to be true
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   350
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   351
	 aNumber * aNumber class unity = aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   352
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   353
	This must be true regardless of how a given subclass chooses to define #*"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   354
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   355
	^self fromReal: 1
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   356
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   357
f014922e3b71 Initial revision
claus
parents:
diff changeset
   358
zero
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   359
	"Answer the value which allows, for any given arithmetic value, the following to be true
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   360
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   361
		aNumber + aNumber class zero = aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   362
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   363
	This must be true regardless of how a given subclass chooses to define #+"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   364
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   365
	^self fromReal: 0
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   366
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   367
f014922e3b71 Initial revision
claus
parents:
diff changeset
   368
!ArithmeticValue methodsFor: 'testing'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   369
f014922e3b71 Initial revision
claus
parents:
diff changeset
   370
isComplex
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   371
	"Answer whether the receiver has an imaginary part"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   372
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   373
	^false
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   374
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   375
f014922e3b71 Initial revision
claus
parents:
diff changeset
   376
isReal
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   377
	^ true
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   378
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   379
f014922e3b71 Initial revision
claus
parents:
diff changeset
   380
!Number methodsFor: 'mathematical functions'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   381
f014922e3b71 Initial revision
claus
parents:
diff changeset
   382
conjugated
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   383
	"Return the complex conjugate of this Number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   384
	^ self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   385
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   386
f014922e3b71 Initial revision
claus
parents:
diff changeset
   387
imaginary
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   388
	"Return the imaginary part of this Number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   389
	^ 0
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   390
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   391
f014922e3b71 Initial revision
claus
parents:
diff changeset
   392
real
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   393
	"Return the real part of this Number."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   394
	^ self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   395
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   396
f014922e3b71 Initial revision
claus
parents:
diff changeset
   397
!Number methodsFor: 'converting'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   398
f014922e3b71 Initial revision
claus
parents:
diff changeset
   399
% aNumber 
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   400
	"Answer a complex number with the receiver as the real part and 
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   401
	aNumber as the imaginary part"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   402
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   403
	^Complex real: self imaginary: aNumber
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   404
!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   405
f014922e3b71 Initial revision
claus
parents:
diff changeset
   406
asComplex
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   407
	"Answer a complex number with the receiver as the real part and 
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   408
	zero as the imaginary part"
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   409
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   410
	^Complex fromReal: self
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   411
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   412
f014922e3b71 Initial revision
claus
parents:
diff changeset
   413
!Point methodsFor: 'converting'!
f014922e3b71 Initial revision
claus
parents:
diff changeset
   414
f014922e3b71 Initial revision
claus
parents:
diff changeset
   415
asComplex
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   416
	"Return a complex number whose real and imaginary components are the x and y
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   417
	 coordinates of the receiver."
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   418
	^ x % y
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   419
! !
f014922e3b71 Initial revision
claus
parents:
diff changeset
   420
f014922e3b71 Initial revision
claus
parents:
diff changeset
   421
" The above file is a Manchester Goodie.  It is distributed freely on condition
f014922e3b71 Initial revision
claus
parents:
diff changeset
   422
 that you observe these conditions in respect of the whole Goodie, and on
f014922e3b71 Initial revision
claus
parents:
diff changeset
   423
 any significant part of it which is separately transmitted or stored:
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   424
	* You must ensure that every copy includes this notice, and that
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   425
	  source and author(s) of the material are acknowledged.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   426
	* These conditions must be imposed on anyone who receives a copy.
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   427
	* The material shall not be used for commercial gain without the prior
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   428
	  written consent of the author(s).
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   429
f014922e3b71 Initial revision
claus
parents:
diff changeset
   430
 For more information about the Manchester Goodies Library (from which 
f014922e3b71 Initial revision
claus
parents:
diff changeset
   431
 this file was distributed) send e-mail:
1944
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   432
	To: goodies-lib@cs.man.ac.uk
9fb0b642d2ca packages
Claus Gittinger <cg@exept.de>
parents: 265
diff changeset
   433
	Subject: help 
265
f014922e3b71 Initial revision
claus
parents:
diff changeset
   434
"!