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