LargeFloat.st
author Claus Gittinger <cg@exept.de>
Tue, 28 May 2019 16:19:05 +0200
changeset 24218 7c7369cb0189
parent 24217 019d3192fecf
child 24220 6f761d2b4f20
permissions -rw-r--r--
#BUGFIX by cg class: LargeFloat comment/format in:17 methods class: LargeFloat class comment/format in: #fromFraction:precision:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23739
3a4a83bb825b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22299
diff changeset
     1
"{ Encoding: utf8 }"
3a4a83bb825b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22299
diff changeset
     2
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 2003 by eXept Software AG
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
21803
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
    14
"{ Package: 'stx:libbasic' }"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
21803
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
    16
"{ NameSpace: Smalltalk }"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
LimitedPrecisionReal subclass:#LargeFloat
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    19
	instanceVariableNames:'biasedExponent mantissa precision'
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
    20
	classVariableNames:'Zero One NaN PositiveInfinity NegativeInfinity Pi_1000 E_1000
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
    21
		Ln10 DefaultPrecision'
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	poolDictionaries:''
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
	category:'Magnitude-Numbers'
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
!LargeFloat class methodsFor:'documentation'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
copyright
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
 COPYRIGHT (c) 2003 by eXept Software AG
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
              All Rights Reserved
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 This software is furnished under a license and may be used
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 only in accordance with the terms of that license and with the
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 inclusion of the above copyright notice.   This software may not
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 be provided or otherwise made available to, or used by, any
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 other person.  No title to or ownership of the software is
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
 hereby transferred.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
documentation
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
"
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    44
    Attention:
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    45
        Experimental & Unfinished Code.
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    46
        The implementation is neither complete nor tuned for performance - still being developed.
7547
7c6a67444648 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7546
diff changeset
    47
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    48
    This class provides arbitrary precision floats. 
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
    49
      
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    50
    I store floating point numbers in base 2 with some arbitrary precision (arbitrary number of bits).
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    51
    I do inexact arithmetic like Float.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    52
    But I am very slow due to emulated (Large) Integer arithmetic... (compared to IEEE 754 hardwired)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    53
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    54
    Unlike Float, mantissa is not normalized under the form 1.mmmmmm
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    55
    It is just stored as an integer.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    56
    The sign is stored in the mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    57
    biasedExponent is the power of two that multiply the mantissa to form the number. there is no limitation of exponent (overflow or underflow), unless you succeed in exhausting the VM memory...
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    58
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    59
    Like Float, my arithmetic operations are inexact. They will round to nearest precision LargeFloat.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    60
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    61
    If two different precisions are used in arithmetic, the result is expressed in the higher precision.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    62
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    63
    Default operating mode is rounding, but might be one of the other possibility (truncate floor ceiling).
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    64
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    65
    Instance Variables:
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    66
            mantissa        <Integer>       the bits of mantissa including sign
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    67
            exponent        <Integer>       the times two power to multiply the mantissa (floating binary scale)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    68
            precision       <Magnitude>     number of bits to be stored in mantissa when I am normalized
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
    69
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    [author:]
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
        Claus Gittinger
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    [see also:]
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
        Number
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
        Float LongFloat ShortFloat Fraction FixedPoint 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        SmallInteger LargeInteger
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
examples
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
    82
  pi should be (500 digits below):
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
    83
       3.14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651328230664709384460955058223172535940812848111745028410270193852110555964462294895493038196442881097566593344612847564823378678316527120190914564856692346034861045432664821339360726024914127372458700660631558817488152092096282925409171536436789259036001133053054882046652138414695194151160943305727036575959195309218611738193261179310511854807446237996274956735188575272489122793818301194912
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
    84
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
    85
       '%500.498e' printf:{ (1.0 asLargeFloatPrecision:500) pi }
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
    86
       
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
    87
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    88
  1000 factorial as a LargeFloat:
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    89
     (1 to:1000) inject:1 asLargeFloat into:[:p :m | p * m]          
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    91
  1000 factorial as an Integer:
7550
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
    92
     (1 to:1000) inject:1 into:[:p :m | p * m]                 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    94
  compute 20000.0 factorial:
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
     Time millisecondsToRun:[ 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
        (1 to:20000) inject:1 asLargeFloat into:[:p :m | p * m]
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    97
     ] -> 210
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
    99
  compute 20000 factorial:
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
     Time millisecondsToRun:[ 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
        (1 to:20000) inject:1 into:[:p :m | p * m]
22108
f52220e58d10 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22049
diff changeset
   102
     ] -> 160 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
!LargeFloat class methodsFor:'instance creation'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   108
fromFraction:aFraction precision:n
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   109
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   110
    "Note: form below would not be the closest approximation
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   111
    ^ (numerator asLargeFloatPrecision: n)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   112
            inPlaceDivideBy: (denominator asLargeFloatPrecision: n)"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   113
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   114
    | a b mantissa exponent nBits ha hb hm hasTruncatedBits numerator denominator |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   115
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   116
    numerator := aFraction numerator.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   117
    denominator := aFraction denominator.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   118
    
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   119
    a := numerator abs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   120
    b := denominator abs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   121
    ha := a highBit.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   122
    hb := b highBit.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   123
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   124
    "If both numerator and denominator are represented exactly in floating point number,
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   125
    then fastest thing to do is to use hardwired float division"
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   126
    nBits := n + 1.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   127
    (ha < nBits and: [hb < nBits]) 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   128
            ifTrue: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   129
                    [^(numerator asLargeFloatPrecision: n) 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   130
                            inPlaceDivideBy: (denominator asLargeFloatPrecision: n)].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   131
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   132
    "Shift the fraction by a power of two exponent so as to obtain a mantissa with n+1 bits.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   133
    First guess is rough, the mantissa might have n+2 bits."
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   134
    exponent := ha - hb - nBits.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   135
    exponent > 0 
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   136
            ifTrue: [b := b bitShift: exponent]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   137
            ifFalse: [a := a bitShift: exponent negated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   138
    mantissa := a quo: b.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   139
    hasTruncatedBits := a > (mantissa * b).
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   140
    hm := mantissa highBit.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   141
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   142
    "Remove excess bits in the mantissa."
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   143
    hm > nBits 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   144
            ifTrue: 
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   145
                    [exponent := exponent + hm - nBits.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   146
                    hasTruncatedBits := hasTruncatedBits or: [mantissa anyBitOfMagnitudeFrom: 1 to: hm - nBits].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   147
                    mantissa := mantissa bitShift: nBits - hm].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   148
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   149
    "Check if mantissa must be rounded upward.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   150
    The case of tie (mantissa odd & hasTruncatedBits not)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   151
    will be handled by Integer>>asLargeFloatPrecision:."
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   152
    (hasTruncatedBits and: [mantissa odd])
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   153
            ifTrue: [mantissa := mantissa + 1].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   154
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   155
    "build the LargeFloat from mantissa and exponent"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   156
    ^(aFraction positive 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   157
            ifTrue: [mantissa asLargeFloatPrecision: n]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   158
            ifFalse: [mantissa negated asLargeFloatPrecision: n]) 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   159
                    inPlaceTimesTwoPower: exponent
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   160
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   161
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   162
     (1/2) asLargeFloat       
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   163
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   164
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   165
    "Created: / 26-05-2019 / 03:54:31 / Claus Gittinger"
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   166
    "Modified (format): / 28-05-2019 / 16:13:06 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   167
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   168
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
fromInteger:anInteger
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   170
    ^ (self basicNew 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
        mantissa:anInteger 
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   172
        exponent:0)  normalize
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
     LargeFloat fromInteger:123456
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
     1 asLargeFloat       
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
     2 asLargeFloat       
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
     1000 factorial asLargeFloat             
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
    "
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   181
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   182
    "Modified: / 27-05-2019 / 16:47:15 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   183
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   184
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   185
fromInteger:anInteger precision:n
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   186
    ^ (self basicNew 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   187
        mantissa:anInteger 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   188
        exponent:0
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   189
        precision:n) normalize
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   190
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   191
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   192
     LargeFloat fromInteger:123456 precision:6
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   193
     1000 factorial asLargeFloat  
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   194
     1 asLargeFloat == 1 asLargeFloat
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   195
     1.0 asLargeFloat == 1.0 asLargeFloat
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   196
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   197
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   198
    "Created: / 26-05-2019 / 03:54:44 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   199
    "Modified: / 27-05-2019 / 16:46:59 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
fromLimitedPrecisionReal:aLimitedPrecisionReal
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    |shifty numBytes numBitsInMantissa maskMantissa numBitsInExponent maskExponent
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
   204
     numIntegerBits numBits biasExponent sign expPart fractionPart fraction exp|
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
    aLimitedPrecisionReal isFinite ifFalse:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
        aLimitedPrecisionReal isNaN ifTrue:[^ self NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
        aLimitedPrecisionReal > 0 ifTrue:[^ self infinity].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
        ^ self negativeInfinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
    numBytes := aLimitedPrecisionReal basicSize.
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
   213
    numBitsInMantissa := aLimitedPrecisionReal numBitsInMantissa. maskMantissa := (1 bitShift:numBitsInMantissa) - 1.
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
   214
    numBitsInExponent := aLimitedPrecisionReal numBitsInExponent. maskExponent := (1 bitShift:numBitsInExponent) - 1.
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
   215
    numIntegerBits := aLimitedPrecisionReal numBitsInIntegerPart.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
    numBits := numBitsInMantissa + numBitsInExponent. 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
    biasExponent := maskExponent bitShift:-1.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
    shifty := LargeInteger basicNew numberOfDigits:numBytes.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
    UninterpretedBytes isBigEndian ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
        1 to:numBytes do:[:i | shifty digitAt:(numBytes+1-i) put:(aLimitedPrecisionReal basicAt:i)].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    ] ifFalse:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
        1 to:numBytes do:[:i | shifty digitAt:i put:(aLimitedPrecisionReal basicAt:i)].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    sign := (shifty bitAt:numBits+1) == 0 ifTrue: [1] ifFalse: [-1].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    expPart := (shifty bitShift:numBitsInMantissa negated) bitAnd: maskExponent.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
    fractionPart := shifty bitAnd:maskMantissa.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
    ( expPart=0 and: [ fractionPart=0 ] ) ifTrue: [ ^ self zero  ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
    numIntegerBits == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
        " Replace omitted leading 1 in fraction (Notice: quadIEEE format does not do this)"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
        fraction := fractionPart bitOr: (maskMantissa + 1).
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
    ] ifFalse:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
        fraction := fractionPart.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
    "Unbias exponent"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
    exp := biasExponent - expPart + (numBitsInMantissa - numIntegerBits).
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   240
    ^ (self basicNew 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
        mantissa:(fraction * sign) 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
        exponent:(exp negated)
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   243
        precision:(aLimitedPrecisionReal precision))  normalize    
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
    "
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   246
     1.0 asLargeFloat
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   247
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   248
     take a look at the precision...
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   249
     
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   250
     1.0 asShortFloat asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   251
     1.0 asLongFloat asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   252
     1.0 asQDouble asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   253
     1 asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   254
     (5/3) asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   255
     (3/5) asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   256
     (1/2) asLargeFloat       
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   257
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
     2.0 asLargeFloat       
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
     20000.0 asLargeFloat   
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
     2e6 asLargeFloat                                  
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
     1e300 asLargeFloat             
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
     2e300 asLargeFloat             
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
     0.5 asLargeFloat      
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
     0.25 asLargeFloat     
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
     (1.0/20000.0) asLargeFloat 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
     2e-6 asLargeFloat        
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
     2e-300 asLargeFloat      
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
     -1.0 asLargeFloat       
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
     -0.5 asLargeFloat      
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
     Float NaN asLargeFloat              
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
     Float infinity asLargeFloat         
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
     Float negativeInfinity asLargeFloat 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
    "
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   277
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   278
    "Modified (comment): / 17-07-2017 / 15:09:30 / cg"
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
   279
    "Modified: / 28-05-2019 / 09:04:35 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
mantissa:m exponent:e
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   283
    ^ (self basicNew mantissa:m exponent:e) normalize
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
     LargeFloat mantissa:1 exponent:0 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
     LargeFloat mantissa:2 exponent:0 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
     LargeFloat mantissa:4 exponent:0   
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
     LargeFloat mantissa:8 exponent:0 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
     LargeFloat mantissa:1 exponent:-1
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
     LargeFloat mantissa:1 exponent:-2
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
     LargeFloat mantissa:1 exponent:-3
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
    "
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   294
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   295
    "Modified: / 27-05-2019 / 16:48:33 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
mantissa:m exponent:e precision:p
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   299
    ^ (self basicNew mantissa:m exponent:e precision:p) normalize
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   300
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   301
    "Modified: / 27-05-2019 / 16:48:39 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
!LargeFloat class methodsFor:'class initialization'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
initialize
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
    NaN := self mantissa:0 exponent:999.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
    PositiveInfinity := self mantissa:0 exponent:1.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
    NegativeInfinity := self mantissa:0 exponent:-1.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
    One := self mantissa:1 exponent:0.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
    Zero := self mantissa:0 exponent:0.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   313
    DefaultPrecision := 200.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   314
    
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   315
    
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
     LargeFloat initialize
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
    "
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   319
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   320
    "Modified: / 10-10-2017 / 15:56:36 / cg"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   323
!LargeFloat class methodsFor:'coercing & converting'!
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   324
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   325
coerce:aNumber
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   326
    "return the argument as a LargeFloat"
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   327
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   328
    ^ aNumber asLargeFloat
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   329
! !
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   330
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
!LargeFloat class methodsFor:'constants'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    ^ NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
     LargeFloat NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
     (0.0 uncheckedDivide:0.0)
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
infinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
    ^ PositiveInfinity 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
     LargeFloat infinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
     (1.0 uncheckedDivide:0.0)
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   351
ln10
22049
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   352
    "return the ln(10) as largeFloat with approx. 500 bits of precision"
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   353
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   354
    Ln10 isNil ifTrue:[
22049
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   355
        Ln10 := (10.0 asLargeFloat ln_withAccuracy:(LongFloat readFrom:'1e-100')) precision:100
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   356
    ].
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   357
    ^ Ln10
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   358
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   359
    "
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   360
     LargeFloat ln10
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   361
    "
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   362
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   363
    "Created: / 17-07-2017 / 15:15:25 / cg"
22049
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   364
    "Modified: / 17-07-2017 / 16:42:27 / cg"
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   365
!
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   366
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
negativeInfinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
    ^ NegativeInfinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
     LargeFloat negativeInfinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
     (-1.0 uncheckedDivide:0.0)
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   376
one
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   377
    ^ One
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   378
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   379
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   380
     LargeFloat one
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   381
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   382
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   383
    "Created: / 26-05-2019 / 03:47:18 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   384
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   385
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
pi
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
    Pi_1000 isNil ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
        Pi_1000 := FixedPoint pi asLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
    ^ Pi_1000.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
     LargeFloat pi
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
unity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
    ^ One
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
     LargeFloat unity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
zero
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    ^ Zero
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
     LargeFloat zero
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
8634
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   413
!LargeFloat class methodsFor:'queries'!
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   414
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   415
defaultPrecision
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   416
    ^ DefaultPrecision
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   417
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   418
    "Created: / 10-10-2017 / 15:58:03 / cg"
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   419
!
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   420
8634
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   421
radix
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   422
   "answer the radix of a LargeFloats exponent"
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   423
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   424
    ^ 2 
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   425
! !
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
   426
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
!LargeFloat methodsFor:'accessing'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   429
biasedExponent
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   430
    "anwser the raw exponent;
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   431
     this is not what a standard floating point representation expects"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   432
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   433
    ^ biasedExponent
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   434
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   435
    "Created: / 27-05-2019 / 16:38:43 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   436
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   437
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   438
decimalPrecision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   439
	^ precision * (2 log: 10)
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   440
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   441
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
exponent
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   443
	"anwser the floating point like exponent e,
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   444
	of self normalized as
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   445
	1.mmmmmm * (2 raisedTo: e)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   446
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   447
	self isZero ifTrue: [^0].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   448
	^biasedExponent + self precisionInMantissa - 1
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
mantissa
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
    ^ mantissa
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   455
nextToward: aNumber 
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   456
        "answer the nearest floating point number to self with same precision than self,
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   457
        toward the direction of aNumber argument.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   458
        If the nearest one falls on the other side of aNumber, than answer a Number"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   459
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   460
        | next |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   461
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   462
        "if self is greater, decrease self, but never under aNumber"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   463
        self > aNumber 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   464
                ifTrue: 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   465
                        [next := self predecessor.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   466
                        ^next >= aNumber 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   467
                                ifTrue: [next]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   468
                                ifFalse: [aNumber]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   469
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   470
        "if self is smaller, increase self, but never above aNumber"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   471
        self < aNumber 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   472
                ifTrue: [next := self successor.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   473
                        ^next <= aNumber 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   474
                                ifTrue: [next]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   475
                                ifFalse: [aNumber]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   476
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   477
        "if we are equal, return self"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   478
        ^self
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   479
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   480
    "Modified (comment): / 28-05-2019 / 16:18:01 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   481
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   482
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
precision
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
    ^ precision ? 200
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   485
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   486
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   487
significand
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   488
	^self timesTwoPower: self exponent negated
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   489
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   490
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   491
significandAsInteger
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   492
	self normalize.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   493
	^mantissa abs
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
!LargeFloat methodsFor:'arithmetic'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
* aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
    ^ aNumber productFromLargeFloat:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
+ aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
    ^ aNumber sumFromLargeFloat:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
    "
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   506
     1.0 asLargeFloat + 20 asLargeFloat
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   507
     1.0 asLargeFloat + 20
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   508
     1.0 asLargeFloat + 20.0 
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   509
     1.0 asLargeFloat + ( 2 / 5 ) 
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   510
     1.0 asLargeFloat + 0.4 asLargeFloat 
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   511
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   512
     20 asLargeFloat + 1.0 asLargeFloat
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   513
     20 + 1.0 asLargeFloat 
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   514
     20.0 + 1.0 asLargeFloat 
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   515
     ( 2 / 5 ) + 1.0 asLargeFloat 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
    "
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   517
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
   518
    "Modified (comment): / 17-07-2017 / 15:06:20 / cg"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
- aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
    ^ aNumber differenceFromLargeFloat:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
/ aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
    ^ aNumber quotientFromLargeFloat:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   529
// aNumber
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   530
    "return the integer quotient of dividing the receiver by aNumber with
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   531
     truncation towards negative infinity."
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   532
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   533
    ^ (self / aNumber) asInteger
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   534
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   535
    "
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   536
     8 asFloat // 2
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   537
     -8 asFloat // 2   
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   538
     9 asFloat // 2
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   539
     -9 asFloat // 2   
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   540
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   541
     8 asLargeFloat // 2 
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   542
     -8 asLargeFloat // 2   
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   543
     9 asLargeFloat // 2 
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   544
     -9 asLargeFloat // 2   
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   545
    "
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   546
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   547
    "Created: / 10-10-2017 / 15:50:01 / cg"
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   548
!
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   549
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   550
naiveRaisedToInteger: n
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   551
	"Very naive algorithm: use full precision.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   552
	Use only for small n"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   553
	| m e |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   554
	m _ mantissa raisedToInteger: n. 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   555
	e _ biasedExponent * n.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   556
	^(m asLargeFloatPrecision: precision) timesTwoPower: e
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   557
	
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   558
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   559
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
negated
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
    mantissa = 0 ifTrue:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   562
        biasedExponent = 0 ifTrue:[ ^ self ].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
        self == NaN ifTrue:[^ self].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
        self == NegativeInfinity ifTrue:[^ PositiveInfinity].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
        ^ NegativeInfinity
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
    ^ self class 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
        mantissa:(mantissa negated)
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   570
        exponent:biasedExponent 
7459
9cc5219fa2cd *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7445
diff changeset
   571
        precision:self precision.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
     LargeFloat unity negated
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
    "
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   576
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   577
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   578
one
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   579
	^self class 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   580
		mantissa: 1
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   581
		exponent: 0
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   582
		precision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   583
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   584
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   585
pi
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   586
	"answer the value of pi rounded to precision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   587
	Note: use the Brent-Salamin Arithmetic Geometric Mean algorithm"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   588
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   589
	| a b c k pi oldpi oldExpo expo |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   590
	a _ self one asLargeFloatPrecision: precision + 16.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   591
	b _ (a timesTwoPower: 1) sqrt reciprocal.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   592
	c _ a timesTwoPower: -1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   593
	k _ 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   594
	oldpi _ Float pi.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   595
	oldExpo _ 2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   596
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   597
	[| am gm a2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   598
	am _ a + b timesTwoPower: -1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   599
	gm _ (a * b) sqrt.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   600
	a _ am.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   601
	b _ gm.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   602
	a2 _ a squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   603
	c inPlaceSubtract: (a2 - b squared timesTwoPower: k).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   604
	pi _ (a2 timesTwoPower: 1) / c.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   605
	expo _ (oldpi - pi) exponent.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   606
	expo isZero or: [expo > oldExpo or: [expo < (-1 - precision)]]] 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   607
			whileFalse: 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   608
				[oldpi _ pi.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   609
				oldExpo _ expo.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   610
				k _ k + 1].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   611
	^pi asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   612
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   613
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   614
piDoublePrecision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   615
	^ (self class mantissa: 0 exponent: 0 precision: precision + 1 * 2) pi
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   616
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   617
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   618
raisedToInteger: anInteger 
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   619
        | bitProbe highPrecisionSelf n result |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   620
        n := anInteger abs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   621
        (n < 5 or: [n * precision < 512])
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   622
                ifTrue: [^ self naiveRaisedToInteger: anInteger].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   623
        bitProbe := 1 bitShift: n highBit - 1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   624
        highPrecisionSelf := self asLargeFloatPrecision: n highBit * 2 + precision + 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   625
        result := highPrecisionSelf one.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   626
        
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   627
        [(n bitAnd: bitProbe) = 0 ifFalse: [result := result * highPrecisionSelf].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   628
        (bitProbe := bitProbe bitShift: -1) > 0]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   629
                whileTrue: [result := result squared].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   630
                
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   631
        ^ (anInteger negative
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   632
                ifTrue: [result reciprocal]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   633
                ifFalse: [result])
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   634
                asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   635
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   636
    "Modified (format): / 28-05-2019 / 16:18:15 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   637
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   638
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   639
reciprocal
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   640
	^self copy inPlaceReciprocal
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   641
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   642
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   643
squared
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   644
        | result |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   645
        result := self copy.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   646
        result inPlaceMultiplyBy: self.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   647
        ^result
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   648
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
   649
    "Modified (format): / 28-05-2019 / 16:18:29 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   650
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   651
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   652
timesTwoPower: n 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   653
	^ self isZero
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   654
		ifTrue: [self]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   655
		ifFalse: [self copy inPlaceTimesTwoPower: n]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   656
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   657
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   658
zero
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   659
	^self class 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   660
		mantissa: 0
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   661
		exponent: 0
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   662
		precision: precision
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
!LargeFloat methodsFor:'coercing & converting'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
asInteger
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
    "return an integer with same value - might truncate"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   670
    biasedExponent = 0 ifTrue:[^ mantissa].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
    mantissa == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
        "/ INF or NAN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
        ^ self class
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
            raise:#domainErrorSignal
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
            receiver:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
            selector:#asInteger
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
            arguments:#()
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
            errorString:'Cannot represent non-finite as integer'.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
"/        ^ self asMetaNumber.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   683
    biasedExponent > 0 ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   684
        ^ mantissa * (2 raisedTo:biasedExponent)
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
    ].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   686
    ^ mantissa // (2 raisedTo:biasedExponent negated)
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   688
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   689
     (self new exponent:0 mantissa:100) asInteger 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   690
     (self new exponent:1 mantissa:100) asInteger 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
     (self new exponent:-1 mantissa:100) asInteger 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
asLargeFloat
21803
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
   696
    "return a large float with same value - that's me"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
    ^ self
21803
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
   699
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
   700
    "Modified (comment): / 12-06-2017 / 20:56:44 / cg"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
asTrueFraction
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
    "Answer a fraction or integer that EXACTLY represents self."
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   706
    biasedExponent = 0 ifTrue: [ ^ mantissa].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
    mantissa == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
        "/ INF or NAN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
        ^ self class
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
            raise:#conversionErrorSignal
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
            receiver:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
            selector:#asTrueFraction
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
            arguments:#()
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
            errorString:'Cannot represent non-finite float as fraction'.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
"/        ^ self asMetaNumber.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   719
    biasedExponent > 0 ifTrue: [
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   720
        ^ mantissa bitShift:biasedExponent 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
    ].
7552
4e9947615379 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7550
diff changeset
   722
    ^ Fraction
4e9947615379 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7550
diff changeset
   723
        numerator: mantissa
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   724
        denominator: (1 bitShift:biasedExponent negated) 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
     0.3 asFloat asTrueFraction   
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
     0.3 asShortFloat asTrueFraction  
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
     0.3 asLongFloat asTrueFraction   
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
     0.3 asLargeFloat asTrueFraction   
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
     1 asLargeFloat asTrueFraction     
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
     2 asLargeFloat asTrueFraction     
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
     0.5 asLargeFloat asTrueFraction     
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
     0.25 asLargeFloat asTrueFraction     
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
     -0.25 asLargeFloat asTrueFraction    
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
     0.125 asLargeFloat asTrueFraction    
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
     -0.125 asLargeFloat asTrueFraction    
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
     1.25 asLargeFloat asTrueFraction       
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
     3e37 asLargeFloat asTrueFraction     
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
     LargeFloat NaN asTrueFraction               -> error
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
     LargeFloat infinity asTrueFraction          -> error
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
     LargeFloat negativeInfinity asTrueFraction  -> error
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
coerce:aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
    "return the argument as a LargeFloat"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
    ^ aNumber asLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
generality
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   757
    "return the generality value - see ArithmeticValue>>retry:coercing:"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
    ^ 100
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
!LargeFloat methodsFor:'comparing'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
< aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
    "return true, if the argument is greater"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
    ^ aNumber lessFromLargeFloat:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
= aNumber
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
    "return true, if the argument is equal in value"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
    ^ aNumber equalFromLargeFloat:self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
     LargeFloat unity = LargeFloat zero  
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
     LargeFloat unity = LargeFloat unity 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
     LargeFloat unity = nil            
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
     LargeFloat unity ~= nil            
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
hash
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
    "return a number for hashing; redefined, since floats compare
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
     by numeric value (i.e. 3.0 = 3), therefore 3.0 hash must be the same
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
     as 3 hash."
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   789
    biasedExponent == 0 ifTrue:[^ mantissa hash].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   790
    biasedExponent < 64 ifTrue:[^ (mantissa bitShift:biasedExponent) hash ].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   791
    ^ mantissa hash bitXor:biasedExponent hash
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
     LargeFloat unity hash
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
     LargeFloat zero hash
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
     3 hash       
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
     3.0 hash
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
     3.1 hash  
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
     3.14159 hash  
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
     31.4159 hash 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
     3.141591 hash 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
     1.234567890123456 hash  
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
     1.234567890123457 hash   
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
     Set withAll:#(3 3.0 99 99.0 3.1415)
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
    "
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   809
!LargeFloat methodsFor:'converting'!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   810
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   811
asFloat
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   812
	"Convert to a IEEE 754 double precision floating point."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   813
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   814
	precision > Float precision ifTrue: [^(self copy setPrecisionTo: Float precision) asFloat].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   815
	^mantissa asFloat timesTwoPower: biasedExponent
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   816
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   817
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   818
asFraction
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   819
	^self asTrueFraction
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   820
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   821
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   822
asLargeFloatPrecision: n 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   823
	^ precision = n
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   824
		ifTrue: [self]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   825
		ifFalse: [self copy setPrecisionTo: n]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   826
! !
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
   827
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   828
!LargeFloat methodsFor:'copying-private'!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   829
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   830
postCopy
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   831
    biasedExponent := biasedExponent copy.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   832
    mantissa := mantissa copy.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   833
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   834
    "Created: / 27-05-2019 / 14:56:59 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   835
! !
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   836
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
!LargeFloat methodsFor:'double dispatching'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
differenceFromLargeFloat:aLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
    |otherExponent otherMantissa e m|
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   842
    otherExponent := aLargeFloat biasedExponent.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
    otherMantissa := aLargeFloat mantissa.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
    otherMantissa == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
        otherExponent = 0 ifTrue:[^ self negated].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   847
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
        aLargeFloat isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
        self isFinite ifTrue:[^ aLargeFloat].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
        aLargeFloat sign ~~ self sign ifTrue:[^ self negated].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   851
        ^ NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853
    mantissa == 0 ifTrue:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   854
        biasedExponent = 0 ifTrue:[^ aLargeFloat].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   855
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   856
        self isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   857
        ^ self negated
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   858
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   859
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   860
    otherExponent = biasedExponent ifTrue:[
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   861
        m := otherMantissa - mantissa. 
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   862
        e := biasedExponent
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   863
    ] ifFalse:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   864
        otherExponent> biasedExponent ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   865
            m := (otherMantissa bitShift:(otherExponent-biasedExponent)) - mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   866
            e := biasedExponent
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   867
        ] ifFalse:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   868
            m := otherMantissa - (mantissa bitShift:(biasedExponent-otherExponent)).
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   869
            e := otherExponent
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   870
        ]
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   871
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   872
    ^ self class
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   873
        mantissa:m 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   874
        exponent:e
7550
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
   875
        precision:(self precision min:aLargeFloat precision)
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   876
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   877
    "Modified: / 27-05-2019 / 16:39:06 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   878
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   879
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   880
equalFromLargeFloat:aLargeFloat
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   881
    aLargeFloat biasedExponent = biasedExponent ifTrue:[
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   882
        ^ aLargeFloat mantissa = mantissa
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   883
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   884
    "assuming normalized numbers, they cannot be equal then"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   885
    ^ false
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   886
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   887
    "Modified: / 27-05-2019 / 16:39:09 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   888
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   889
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   890
lessFromLargeFloat:aLargeFloat
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   891
    "return true if aLargeFloat < self"
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   892
    
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   893
    |otherExponent otherMantissa|
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   894
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   895
    otherExponent := aLargeFloat biasedExponent.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   896
    otherMantissa := aLargeFloat mantissa.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   897
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   898
    biasedExponent < otherExponent ifTrue:[
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   899
        "/ my exponent is < than the other number's exponent.
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   900
        "/ left-shift the other mantissa
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   901
        ^ (otherMantissa bitShift:(otherExponent-biasedExponent)) < mantissa
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   902
    ].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   903
    otherExponent < biasedExponent ifTrue:[
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   904
        "/ my exponent is > than the other number's exponent.
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   905
        "/ left-shift my mantissa
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   906
        ^ otherMantissa < (mantissa bitShift:(biasedExponent-otherExponent))
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   907
    ].
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   908
    
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   909
    "/ same exponents
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   910
    ^ otherMantissa < mantissa
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   911
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   912
    "
22049
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   913
     (LargeFloat 
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   914
         mantissa:16r73419B6C66183FC9AFD6C972CA17C5BDD9A3E1E589CCECF3D0934A9820699D6471CB8F5C0DEF275FA663B9BEB4387344FFFA2A9CFC8F38D9D45D2249228FCA5F6BA914F5B15F16A9DA13944E435769F32175977EFD55CD5DE8C1EEEBF127F8D4F222F63109CD9C7153E9C3D436D958404340F1A6918F7853DC28F1F6BB2BEBE93274C7E8BF88AAF6846620F323E2A9745CC6B79A230B35D8623FC8BE9DFFA01E93159C01BB42C0C072B101C42F461DF587EF2DA06F67C2E574D53346018E0D58D7FE0C38F1C3EF198C5628D5890FD8BCEE3E0E8CD4ADA9788E43B2C16D9ACA7E90921D1E41E14D2291440A5682AD65DF6769B2C9927E2104A533A4038B708EC6A554F9BB81F5CD026FCAFA11EE5316A2C3BB1FCE935D91E14123ABDA667BDB9CD8FBB08D3EF0A21000B2B1B0F98812B26B600D207685F1A15C4D8FD48D87E255A983D53565A546FA4C56240FCF68A17791768C90979043CE183112C0F8EBE52EF8AEE81CF0DFD8D22D77FEE27837CFC8EE9FECD043E7169972B048697E657F3B6088C929C3E5D17666EA540491782334587DE7263DE82778ED04DDE009F050905515F4525B2BC20EC274626C10C7873E1D80639FD9B2E5B25DD58EEBD5BCE8560F05B3A066E2082F1E01BFEEC9776A25E7CCD13F0264146748BF6F09721FAB18DBACD9C797ECD5B1896B0194266DA6FA0CD8DB214BF362D7145AF5D697EA98B99896340439387B6BAD623B59E50E54310AA8FD38D3B222519E37B55078020AD751CB029AC8B067C557F1E939003F8C88DE55842A485BB736CDAFD1FC0ED330A7BCD0E1D5727393201090FBB03B12D4C8F9B7D05843BF755DF745AD0F8EFB8F33FDD06B072BD79BBABE06CDEF89E3B7B02D951D7669C95F9FB3C602DC192960B534AB7729C0233C6B348DC1505806BCEF16C8E9548BB9A6F80E9D09E6D65ECE1F3CEAE137C9D8F5BD821C26E85D80196DB83BC4EF9ECD128BC5989C9237D7917D2FD9B14A69AF41373496945F70EFE605B681DA9DB61A0CFB3C8330EEF93D7238B7BD2116BA96A7AA9F7844FC3983D09E8A6D2DBE7BBA585D8802773B1E7E9FF846091D181FD532575186BE4A02F62C04D157AF16190B98A3E32C591EE8D4E01FB55351744B829C20D30834D3C423D5D708DF4A64DF51E65F28AC2752AA170B81962E14C618C7A916CB2B68BDCA92E8A9133B4AADBBCC0A13A85BC1F925E4CD9956C0639FA8EEAA72A975F7952E5DD960F8647CCDBD44D34E0B4591B3D8A905686E45F12D2D4FE4B6DA9D026089074D7ADA26BC7A18FADC641694A549EFABA3079387A31A1269E8FB0410A31BBD2D7ED12C8E07978FE61AEED0D546CEA13961D1C294FC277B57C7FF7CA5B0CAA9F714C673848B8C91D4162752A54EBF5F17710D19C62D78892EAF86EF1222C70B1F4986BB7F51876AC419B1CA90894E88328371AFBAD15433C2741830E870700635AA19F71F69A772F920716FBAF780343937AEE25CA0C50C93E47ADBAEC1D23068AD703CEDFD597229B8F84E74B2FD99D96707097310246A9581912298E6B6BAAF1D46F0A2454CDCDC5D62A0738B60D39DB542FC72142CAC9583DC3FE6664C30E42405664696A43AD55633E3380930805D0B33ED87FC6CED153BD9AC623F926273AEF825F8E6AF3080C731BE88705D314CC4275B9A0A959AB99F8B9D312208BD64E5C9848993F2E876EB9C4C3908D8946F9831B31D2124DCBC129EA20D4742CDAA19967BBEFA5135A9D7E546E22B607D3541D8FACC46E241D22CB1120A51AA6A761918F791EDEBD0CCE46CF287C9C5E97D1470A086216EC47EC7896650926123B3C2D0BDEC68B192490FFE4B164D6202E9AC38FFC9ED01A936667A02C6BDA448CC453ECAB674048C1C4F9464683E29A056510797ABC115E99642899463FE9CD0E3553A5D5940B4475555B2B27FCD407402EF9988DBCC49B8E213951C9C8303B1538A9E34310404DBDCB8B29B22822764779F4233DDB802ACD78434888EFC63B09F9F2283A015415D25B182DF6B8A5A6CA584012BFF5D7DBDDCDD3117375293BE18D64C5CB32D9356564DD2D1765C160846BC2F42FBD191802E0B30F6F543C103C93EC9A38306C8092A179895E1CE645ED100E1FF51F12E83EC97B0F9360B5E35959C667648D1343F228C05D3AFB419960153BC780908D62DE5A7B033C0926EBA69610B7F206E9C0A157650F85D05EE12831C254AECD2E3A013B8E0A176B205979B46F60F3104E46A6E667AD4613DB62038A09A7B772DB38AC81CAEA8538B0C266D1B604C9C24F1CCD9F891DF587CA169EDFA45AB7F57E71775D20238079F17433D1BFDD7FC537BF7A6BC02C627EBF7AAD3E5030E788EECEAE1CE0FE09CD0F46941272A54010756593FFA80669955701EA66AEDD96DB6CDAACC9064039C1C3A0D4250CF75A133D5D4314FFC9D678FC1B761B0652DE9DB14CCF1C0546BDC0BA6464EEB9667CFD3E6CF44A476471F0E1801F46C9F7FDD8094C2D08A668FF57A771B64CBAB9241CCDAB6C3A2112059BB67D8044DBA7A95C04FF9AE6D0B5C3FD3F8D76D83BBF28F4D44334895F9468708432BBCAC62458B899F5E400627F83F4F331A74638976401D9D924935B5F5D897AE08E984C9DFDCF457DB4DC5DBAE3D6CC1BF7004ECABFE6326105B9A98CAF4661614052ABB206D6F6C7C51FA0CD5EC2036F367095D0DBEA54F5CE718D1E21EF2DD251D4F1FC6A70D2F8D7F7AB7E3DA847ADC478789E89AE2740270B3B16648A59B40A0A865D9E8C2DF90681F3DA7460EC03C48278C19117FCAA575FF9896A4D467950C84F8794331A44475B1BF6A426CF64BA0C03BA6C862A8855963B99D94CF8062E9F19831D135DC3E1A98D4954D6FB4EC4C2663B6EF0CFCEB628B8FA43E3FDE18B34F3C0FCB63BD1E9CCA9F71007858DFC58AA4D6775C3E7F77746D1420956B9FC21408DFA4DC6A108905D443F9BB0A3D1A30B737787DFAEF96C2F0507799DAE84BBC030B7F423FBBB85D109DFC337BDD0D403A3C6859520F17FE35A39ABF6516A390616DD86ACAF554BC40203F269665A14D1CD40D65852206BE49C7778CEA3D46BEC1A9CD6DA70C36B32E616E41ED54B71DAF6DF38CB937D022EFD61B55A81431809132ECA1B28DFC40703B7E05DD46B77C6E147A596A6CCD1B5BB3E9A24B24BF7C36D2CE8170CB2B59B8558EDBEE28F1CEF80F56B5417E6F9F4776CB8DA0DDD13275BFB8860C63FF5D1EE8E3C9DFB30EFAB30C06C805F7492D5D7D3E9AD6C08560B1F39A09848CC9C165B59D380A3F7F4A8350F9E292486DB513BD32A9D69DFE4C0D8B42D31D623F0D7757DEC1456AD7459FBD4F1370775E79B008623969FB0D4967988A0ABCBFECC86A81F6F331196ED85CD88E7452014BE1B1FDCD6E745D97441CB15030E0FB0C4DFCFABB466FF405024273BA29D896DD17E37E40F795E49B573C3AFD978EC78AB83BB1ACB6E4803C3C12AF5B08ABCA664F352511EF0CC3D9C8F5C4C3E7A420B77E52479C77CE3487F12260633FB53F2FB73615E2C75D6C3B47CE34A6A3047EB437D93C51CD27E66B03E30F78D9EE36C51851115BBE90BB94AAF075FFBA93093928AF492EE832A4869FF5D0715523933E7F9ABFF3A1EC08A39D2FBF53A43A7C4D7FFD69AA907EFFF9B72CD9E285128BF916BC9715A61CB32B2C4E11E38E1621A8ECA1CD20CB2A3AA68E73CE573E38A97B97B7759F18FAC271D8AD7690FC8550091585E555E68833AA88FB4EE95004D4760428820855EF13F4FB0475B353BD9CA3FB6C9CE8A0B4AE63EF5DA7E9B98B9FBD3B1C7EF7B45A7014EB79939921848CC9BBF71287B145FBB55D207F5F0919111542E5352F2B2D00B8A32A0F40EC65810F23C92BF164F104552D3E9CDE975A696954942B435F3840469A4D4A321DE82C4AB109AA276CD777796A1C4186A47786E6DAE4B066D0060F7560B1A5ABD545ABDF70654F01C52EB870620E2C5D34CFA167FEBDC04DF13FE24AA2901F745B8D83613DC459E227903BF97EE0E4107B6B94860B3220CE3DCD04CF73EBDDF4617AB087FA9AB015F2563F786A4AE4F19B5386D68C525802E95CDE7E4469135A566ACAB0E1D4ADB99401A7712179593EAE5BAB70A9116A4AE999304538341B51E6038515D73FABCAD826A87106B3ABD18A95DC0E69B39C26703D5592B30F4C42A87CDBF94DD4681447A7ADD39231EB5E08261AEC134D4670988D59E847883AD1C4C0182D5F87436DF4710A1044613323C2617BB7DAE197CD01D015EDEB979A5760BCD39BEB4A3168A591B8421C578D060F6061AC0E3618C25804784B0431570CF59025DAD46651C392E38A620C588E004E80D4E14A0EFF7D237E6598BE8B0644855118456CFDFA507C6C660B9EBDCCB330CADE0DB4E1229F1DD8512A5921EC1759B4B37433A0E8CAB03BF65FA6FFB7AAD203E3D7410F0CFB0235B37B6C627EC266C68D9CF912AA0BB3E873ABBB1110C7F17CFE86352315E2E172725057BA78DA74C9AD6C1E06C1CE76941CD081027BC932CF296C17BFAE8B32B3D8B77BB6544FD75BA6A0E5E90614DB60000EFF2255600CAA598B8B11F5980FD0F70524BB4982857E1BA8E39A36BB08B2F18BB903CE3708258EB80998FB768FFB7A489959F610043FF2B5DA914A5AE479DAEC2BCFF0F055D1B40F2E7BCFFF14E753E5443420825A2442A362E1277F1D14BAEF6F591873578055DB53EA469F221FDBFA6FFC8F00403B503B1BAB2E9E62ED81BB06E6AF746136BE3500EE4089ACF56898A2333B03300407E841C7F3E6A17BC30E8DB340EF6F840CF64CAA04D86A5AFAC9EBE34A7201EB45B3DE177CB2AB56408CFBF33BC5DED12EB63E3F831993C978065A649417E5625B840709CB6A14610D60485C1DA48CFC8C3E867D5785D32F4E827D0B546B0D473E49CF358CF4F4CDF02A4BDA41938DA8E1E1184DDC76202305CC360F4E9F524B2A00A327C3F18217E4D64260C972D849DDCC375EACAD4B4976929E26C7CB798E34B70F87A73981452F257C8E45826F8A60323624313DAF37177F329D3939649FA9FCAC4D076E163DCBD313C43AEB67D207B5201F7D87AA91B39D9627C0C582BAEE8145387CF3C2827B426FDAB3930A68CE97BB45961F4DA22333CDF4525D8996A51F500456F41EA1486FD22048310AB7593C8D35DFA25CD15BA4D586574FACF98BA6B17CFFBE6B65A68FD3442910093F620AF83BC37C4E8BCDBCDE3D3F7837769D7602B68A1FF08E878198EF73E2A5EA512A4A2AC404B7E3863E36F91FD4E9A54F267164D5E05DAFAEE6037AE815A50B53F2D288185FC9C4C1D01A7EA2A53EFD2EC2B44B616FFCC6A98AEC9A2A36DA7C82B1400C07B6C73A809764E266978A972C71F485562280BB71375A61FF92620DB9A0B1ABEF6956A7BA0B703DFEAF755F0BBA79D11ED191AC25150456ECFB3D9B4CDAEE3C8D010C7EF7348FC44BDF656209361E439F6033A8692941488B5EC0B446B33D777D7A2434D169FD9237EA8963C766E198325A6B52054ABCE94AD928DAF76094397EB216FA8B780A619D93819D34DF2F2AB418FC3F7F2A344EC01F972CD8942509E076BB9A33C36ECA76B6005F14839429B217CAC37D462F58A371F248E635A010CF6108B7189405443A809D56B9959112680AA581A1E75B8B17270AD4A3CFE970E45ADC0779B4E3F6506758853A74782D49BBFF9D6091E1A556AEF45DC87451BBDE54C8174A28797913E3BEB9DB4D339CAC763D074300E03B2BE2CF7B1567D2C950A6169B5AE72C157D2F8F612F3012307E57A6EB1295F601A4496DBC4075A190FCD1876530B4EF87B744191A73BACBE2A0E773E404A70E3E1CAA3221C9DA573BC5F08825939C2078F73FFD566342D23FC1A30F45235CE4F4E6C8B632B26B666F53023D77A091F96AEF17472CE0C7E67A76D71A192A6C8E55F04832A3E1425A0E11FEFA281EB969C7FC27527130A3E7C9DFE7248177829C02CCDE592FBF4EE4D10B6623DA825C64647C0F576E0A65461EBA24D460184529FE288DBB1FCB810AE02879ED11810FD104D0F6BA7419BB803DDC7785661D87CF2CF7835D74951F5C6D8BB4A07692A742C667B93E268A13AFD09471FFA5240873A27962E07E2BE074D6FF0CC0A5BA51EB047F63A4DC51867377143773015F76E0D54EDB1CF91D1D0A2AD4B926788C210708053F49E9417E6C0827735D008C4BACE7FA902E019F696D765C1A7D94F922B0A1831305354F8477583A1C503B296F1467032332BF7EF994D64B876EF9AB6F2737C2E487F9C562BB09B4BC121461A80C46A459B2E455D0CB0C0DE84EDA61C4A41760239CC53202144C25841E8BAC38A8D73A621B1F273B0093593E3D7B5B533B583AD219077510043D086275F57278E4D0C833233077E03E4893F68969A244639F5FCA56E01DB205EDE8BA5A556CFF30E60FD4099CF2223A5743F1C05D1E67D793C82E8652E92C9407A5253AEF9092A5EA2AC4700FDB80323E5EC7440C6D051E33A6EDF44511532388E28F0867E4240ADCD61E75B202A7405E2E661973335D811A9EB71CD0F6730DA8275354B8E26386CE5F996772B00C1A6401B6B44D653A20552514AAE891967ACD3C4E7947BCCE78F845B6019E7CA47672A27A6B41E9B4744926F0FBFB5BC70F7E016F5BDF634397E3123B5B01AADE031B6A478EEED481EAB1FC7BEBBC824094F9A2B5E3341C4B2316384B265D864B2471289B839DC3337378B01FE9F66EFAF9C0A3E829D9CFC3F49F9ACDFCED72701B756C5524EB739CA2227D1592CAA74E476DD7DCD0C7BE8E7F6EF8C8A6935EA50ADF975E3D81AADCCD22B4D7AE60AC515E1971B6E009751CAACD14608B64CF764CE2452B708EC63AE9EF0BE2A3D6A180B2F45353C011C0C29DBDD1D144291F1E3D0719F909B49970664B53000122ABD011C4BE7BB33FF06CD694C5CFD60BDD321F45458C186964223465E0A25007AB28F3B843EE53BB60A65409F1DE6860B7B45A49EDE835F860A4054382A1486A4BFDC0963434BA913D8D891943E3779A3F9A3BEE50844443F7863652F0C2525F654C45A2B4BA9128E98D23A291B94BC52AF419B64BA3A845F7F066F4D98B8FD3765EC94F97676B08D071475EF8C109F15107455E86D8947341B5A089A47858CBBA802BA5F8B08C68C366D7DC14EFC2ACE1E4A3A09553351B9DE051690D88D09F9C9431C73A4FF5F488F29D3D19C98312844421663A31CBC513962B75E9EEFDFA4BF03FC7C9460E3CDA09215E0D55F66A4043676463F0D680D0BBF3C81348E67064E356DE16CE74C04B001DD6D7F6B32547466835F5B2B2C2790292F37CF1E24EE4689A816DC088FA6B923CBC355D829C337663840B89BEB6E4BD95402E81D152B88C5194FD45DEE2AE52970B9205F33E21A3C60BF8FB7AE5C6AD95E1C6C5D7BC2E7C69A86DC3002939DAC5D98A46DC97AEC834F6AAFF3838F06D757FF536422C1E8DBA283D4DDC954041333980C7F73D7E651EA0501253E667F520B553DA3039A7612A7053107ACC64FA7639D74E1AC0033476483C62DD340FDEC823ADAC5979433270F7CE55E66E86297D19A3370D95C653BC9E204338D4A50AD1F77CA8A21EFFDB9A596F625C9708B0C42FAF9A39ABB5E0B003C169854F5E52C0506BA25527876CF6AC5D220C4CA4047FE5891F762C8D02331A7730C9657FD1612232AA6EFEA532531774922394A10117AF4E1C4E93C834D9B9DB36A282E33B8F9AC6CA03D6684FC185DFD3BD5540B3FE98E7ABE26DE57C65A90E0341E92AC700E7C7863E9D9BD0CFB477F1832DA9C18DFABB0D8DA2214D5FB895F42E358A27A9907B40035A292A2BD0EFBC2F82EFAAA04D5D2FF34A3C09D3A449318C7EB326BB57BE88A52AE0B75E9DFD6E504C8512188350107A7CFFB9E9F8109C9CD131CE8419B53C3836E7806B7E24910D8A8F3C13649F497A0BE2CFB711294F8DE601FBE36913529B65E78997580AC9182353452BC742DAC6FA86A5598E6F8AF6BF215A49ADDE14151E57EFC39893A73FE531DE2C038B136D0801DF66135B1EAB463795E21758D55F096318DFC14AC020E58BD7FD47CC90D9D664C32620E63A6EFFF9C6463F8CC52E1DC5D69DC403F0708B02D212FB39CE7DB1443D76CA9F962BB15F28B8C9B6D1F3F28BF9308D84B782085C4A0389D4C725F3B08188C27D3EC81FFF152F15E59E1428D3363FE71718F4B64F7A7F3BABDB87DBF6233B8D5A3A62C5F99CFEFA0FD713EE1D112E066B93280D6A0A98DF95D0E471FFEE44FB832808B23022BFCDE7709D19F2456909DFDE6D9189CFD4868BAC1AE9F4EDB6F0DA3BB8A56FB7060E1C6B86770DD1089DD41BE093AE2887C5892C3B6AAA04671E77909099B8A9CBA8E0D45305954CEC7A76D38A5BE0368ACCE3FF52121705A7996FB0475B1ED152BE5B469E10A91D8B08B4D7B365EB56F40E5381BAD0E4E6A2FA2557653C4B1F0A5C19A06965CA9BA68DD3C16748E9BBB9112C37E1B3966D42CF04E136CC29AFCB124B919CF32DE8ECBCE2E4986448D9BC544E6BA30FCFE1EB1DE332F1ED4D9D11B862B7FE4FA23330461CF5A0E3364F420B3E062C895EA9D4B9A1782B48AEEF023C4034BC1164739406488BCB27BFE44E08A9F19254934DE309637A0A4F429087DE71D30D40E99EE92F3EEA666DD000CEB6A62335A3B1806C812B0584ECD764B5A39931D1F1D35B2C73436548FE7604F666868ECA7E87DA735FEADA16E8671ABC0A0374ABC8BACF3B5818A32F5CD304E5B08F0AB5F0578EE26E6A4651C54545B215C404CE15F13387EBAD29EB52C804555E8045BCA43D0025518C614A7409D608D0B91F8D6B5C678E64AF01BE1D4EB2B765CA248AE2896EC3A2E58045CBD31EFBA4F4D3DE6FB6DD3E649245043349476367C4B422151F4C2BC9BD4CC1CFBCE0155C99115E463B603450C2622A3AC209BD082145717C028AEAAA3F40E180E1CFF740280C6CFEC53D3438253DC3F90301226769077A0E47E3F4F9EA4CEE093860593C5CA3D2A2C9C34E948DF635CDA5D743732A0AEB6F5ADD5B77EEDFB6D5A5A96AF56D383556A796BCAA826205205785332CF4223536FB56FBA32BF3AFD4A76008F433AF2BB5C443CAA751980B49463C4451A2B822F4AA03FA4FEC320B70C1DEBD80873666AF8CFED6BFD622F5C99D9584EFAAA2AEFCBD1B77DEBD977BEE07ED760F722854F329A83C79A2D7474CD8A78099892BE889C437D1A2E1382987D137E8D5A51256A2D561B668F6295687020C095B8FAF3ED2B61703F89FAE4F3F8FAB92B1A8EC58D0ECAFC3517E4797FCDF1241397B49C23DE6EB1BFC42A150DAFF4BB43C936D8ECF25E2B9F7F646374EC2A6DDBF5C55EDC5055EB98E0F2BC7D9240111492DD2895D2367EEFEF6EBC4F217E564706103F257C3CBCC52292081530218D82338ADB0110641504E2086A07F3C74B03961ADC5FE94B0299FAE17F6F09FEE85F7D67B0B066088AF8A41E40CC79986B01DEE4F73AF386EEB0554A1FF6478EC0447BA64895BAA0F238AF9CB8C2EE5F7C3294F4FC5FC4B2E6808B29DCA7C768CA37949B4E9B42A31F1754175801DD92D205A35E77B5C6DF26B15E20B104108DEE7F5742CEBE1D886E68FFF894F4F77DB167DABDD5679018679036CB5FC91D764157DE04EE9EAF4F11F529D96FEAA486DBBE6850F1DF1504A8D65B20441088DDA0C9EE3F851FB134B9AD567411053D55BB50D964727BF14B7F540DAE69F95FC24BCE0769408516C1861B95CC7DB137AFE13715D2DDF72C240F04E607ADCFEBDC52612A12A954B5DD436660BC49C74E521B55B8FB62E99EA6F27E2AEDBA37DAECA2A9B98099004C278759AFF14D9C6BB7D30CC56E0E7DD1F458A2D64748657BACC59A1DED3FEE9CA308884DF5A69F5EF738948DCAAE04EDE0C7811813B92AF605CB631291998A54C00C1B880889AFA90D15DA0960C859AA1C0E050AF5C6A021685D95BCAF85AD37FB7DD1CECAB684BC3DB11DFA815B3E5760402A12EA512AC1E6010AB87C98D23E5D660454356AFBCD8ABE65E023AE1777D5AA187FA7B3E4A7D7480CF3472E876783BE57BA7CC1167A323B444CC9346619AB8B3DACDA8AD3A3054FECDFA98C338A4219EF79D3A7284987C6E664964259F7C960FBDB08F5EC1DAB2C0CBAD93DFB5D2098C2CF2009CCC213F640A506320A53253EFFCC780D881B1DF427C84E90F6460BD89708A7E4075F47F51725214BC4931E3D8940BB32B9E73D1D846CF142BAABA703BC2FEE6718478C2FBF334EA902677C6345F90BA9AD3BBCA778BB54C0B5CA4121DA3B6357771D918154E78B5E3FA921933C26F596B96660EFE988C64EE1672C22F3DC0A88E909EDEF10D5F31E544C96F61C31B483AD3942DD11903613BB496ED7490E9C95E6ED67C3B0CD88D18EF3C6913F722C10E6846DF1162D87A226C6F91835E6E215B1A1167A464CDBF9565382787110CFFE5665E80CF19EC907D0800CC86EE4622074AE171E7B717B440B26F832997960D96695C92D5226084EFA6E0ABCCB31424C69107798909B4CFFBACE608920ECAB318FE65252771C07B2CAB5846B5108D9FE8585391ECF43C6656425AA83EEC0A046A527364267E1DC57F4881E494304948479BB63EE2EFDDF5E9AD9487B454BED7ABEAAAEC16714F4EAF6EFDBB836B32F8DC9D7F81FFAAFF251BD41AAED70BF7313035E5DEB8CCE4BEB9A3AF9C7196A638474313D3FB7CA9635434A15AC344B51486FF11C8C857AC2746D57BF6CD722DB7838EAA5048D786679866A4C4873EEDA01B6C3DBC5E8D9971385F64B4FF675971F37399BAC3D3A78E06051F4A46BA0733D22C4B88BF1331FFDAF6DA706827F0B3E25FDD5447808CF498D6D19E20E8118ABBE0C753B42630C71E1D95DA2A2FAB6191302E86BA53F56B472723A8451A16930243ADA76A2309DA4AB4D257451B237A1407D2B1555BE13DD8519F3DCF4101BE161EE3A4C7820DA60EF2664B4C21B7F83BD5A2C9C73E7BDC5CDA8F7754853200B603C97D0950AEFC147123BAA6139C62EDC56263314BA1640DABE28F7D1AA86C38BC69823E242383B72C1C97F12D78AA6638BCB5E4296E19F2F68D665B36B988718347445F66563FEAFE88639BF7F53C70B3A754C5AA1095660EE40A29D2154031489A207B83976D0AA0117E122A4A879F05D2BF2A3C8629FB845F5C14722954539324F325321B9C46563D5FA5927B9BB0A00921602E77AC6152AA026C421E8B7233077321ABF69FC176E53DB210D802A9DC588F2CAB253BC78041EF75CF0D1479FE381D360BAAA4DCFC1F89F2709FAFAB152141F07617B743463B4CFA112D4E250C0AC07454FBD796C698E042BC3FFD355662C16F55BB5EE265C7DCB016D2F377AF03BB50196B40111AFA8396D20F12136F45B758697303540D6DEEE5A81E0C88502BDE805DE075C73BA21E6939D3FF4957D3C76912F931C84D2E06F8547789A6CD58F8A901AAD3207CCD1143DF7BE3193339A7903DD4178762D2D50DFE3BB57926A1BBD6B7E64F2DE2EA014EB272FAA8B5A911DE3C5E885A5E1568016799641FE5EFF7D592FEDEA1D94B0BEE49F4757556423BBBC1863AAB3085B4BBCF8206A07B56543BF073F0F6873AFBA77DC152EB147EBBD9A46EE0F728B7BD93FD7748549064070D09F05BC50E0CE5927B32959C0AD2DB673CC8B64CBEE624958047A752CAD3D1116777D90AD51276D59DF5944A41FADF3DD4A97C569FB11184F72F0AFC07505EA1BF465F03769CC75841327DD6864C091A2E2C8415EE6B7DADFB1BF8E2DC2C25A019A54084FE2BF01CF2935C548DAF0C4F8A31A5B14A89F37937EC287F3035C46D92DF48039489D3B1293E823417AA8687D2BBE41D14EAAEE2D0742D6F87C534130950F81A04A8A3B42B3B26266B30A7C0276F4739110B9D88FAC9DBC5FE85122E0BFD74653F099F000887373550FC8138F1B6D1369BADAA8861BE8958060BCF2C65788B4BB68AB11DEFBBFC543F2608F0A16D82FD97BD55B06BDE0E17F05C1009607A2734A396BB8CBD718356B3EFBEB1F1586D1606AB3B2701E4B77800C33673C54CF9DCAFE215DFABD53B13879BA663DFB443A717C610671A6F2D65A319BAA06D472472C6F71520888651E33DDB9A72242E23C81933E6CBF951C8FD61942FCA23D7E464D24DB365874AAD627A8CE684FF0B73772A542047C5A8DB9B9B077075707C602384DA8A035092877A27F16774BCF4533B8423CDC7EDDBBE7A27E926031871BD2293CD46109CC9C0CC7E18F06F802BE20FAA35A170D547B864AC931DAE50EA4FDB0C24BFBE2B3E720A66EB5F6EFF5009D69B353FBA489F18835ECC43E3FC2863103513D8986EAC34B31E8BE31CC2BAA2962905988BC0E20BB1D9BF98B82A66544B0FF175B296356BA17217A5D91EC5E38839BB7A3FB575F71290E11D9E42C28B7C63A1E3491C7651D3ECC52539BA21D824FBA6A22A548B91335CA607A630A16F234330F4FF75061B6C9FE4C2E131F4065A0E9BC8BF4967CA4C0238D3CE38291EABC4085198EDE4426AE3FEF38A3A2C70448898C800E726A9BE870263935B6C71998E83801AFA13FA2DDC9760155EF0F960C206E495B78B1411361B98992D7CCAB9623BCF6FCBFA1A5ABB8CAEAB0B25DFC2CF9CE04A0FADC24CFE1EEFB752B287B1DA6BD820C0AEB2CCD414FE618547D3DFDD58E53E6DC4A6E7A1955BD6E451B52616DB150A75EF13808C3BF9D9069FF6DBC76290AE755E97F2B7F3465719495AED6CCEBDBB2B4030010AB1BD9F74C4A216504CDDE4C97B2349822E25C25DE270BBDEF0DEB901F25C8914FBD5919CADCE790537C53749FEE474B6D099CE7AD3B36F748D336892B11AD2F4A9B9173126E805B23D6132D75E9FD4FF9E3913F74FB4C88F8133F9B20E20E239D083F90EA9DF7B599F14DBBF454A5F3A49BEC62149E50772126DBD038D5E6E52AFCF5E11313E33FEBE953500ECB77FBAA17ED2E9F1348A282F7671BC4D285C4099D46DC0CA702A2169102479EB4D291C25C47D997DBBF76DFE7C5C20DD9A4010221579CAC03E837AD9187A0D46D9BF4BF41D2FEE16F49F6F64F428817567A6311F6334A43BE921CD833FE854F901CDBFAD5A5D6908508F6E46C3F65B436A8AD3FF8931390C5BAD82CD274BBB1085064FA1C1F6CDD0EBFCC3E46AE16006A08A48F6BA27794C89B68350A8409F81402237871674695A0512D33BE49A2344B0B2A1B7833775F29E501B88DF27F4ABB2AAF39D114B158DEF012185B4793B3523E839CB24DC605A0F28F21C4C9195722AEA7EE5EADBC41A18C6295E5A3D18F357A3EBC2C5DA8770EADF723DB6166654EFCD0357BF892ED0CA10F8845F6BF8E5EA04AABA6C721187C9E360AFDB868571F9AD5EEB6E50C154EC3399F5CE2E9FF639F08785E39EE7FE92BFCA0E4D4FCEDD46F4CA5FEFD313FAF02DFDE5414E70797553A8CAB1A80FD6572C22C5F133B4FBC172F1E9721BBE70D8667AD968F31D62DBD4B8AC2A49FDA622B1E74B7EA8188093AEDE307F3FEF35507D8D72738152B26C859DD6B0D27A88929AE340471710718D635787E5A67A53AB1C6463E9A8BBA220BDA69D59F25F04A2D670BBBD95B99BB10B393043ED5BF97344E71D31086C75CC3F82F6AE373440FBB56EFFC39E07D9423F003F76BF36F8145A66F4C9FCF79CFDF5930019B26D413BC6ECA59371ED9DFEC86D92C7C364327AC934FABE4A73B361340B423729B2FE5ED24CB5F8B97B55912944FB5BF5B8308FCA7F3077DC61CDD3BDBD603AC14C837F91CFD50F95EE0F25757CB8CCC49F72897A9B90C1B93137D79EA75813440C6591F909B3796EFDDB1AC209675A7028F31404B3C4D57A23BA3C0B71C19DFBFF189083C0CF0ED48EE89DF5BA1F9D9BA39B6C813D4B6CF94835C7B17D9B7031DDF921E9FA2D8CA9D91BED4C0202805993D41DA0102650994D6D818DF2A56E983E903F29BF9423F1190CE0B181808F05A2D2975AB73D49A61A8F7757AFEBD48948766C5EEB176B917342598A5EF51AE3BA1BBB908903A308B6E138249C7C68E788D3AE44A07589D3FE4AA09F1B2166698E4FD1F213DDBE35D38306A5A72A6CE416DBB1888CD0B0C58C3B8878EF04E1B12E0969A7EB01000D51AFF1B962722EC3D0B976ECFBE2E885006622FD6D4A6F28C4DC6D69FDC0B1BA28B285DC1E3D6338F33FC41881E378D9019A894CC6F2AA13D65D4028C988E5D8E76C5A3F390FE8C943043AF1CF59238DE9D24617EA2512A018DDB523428049D63E524E9CEF36D5E57A8F94DB5214C919E70078D8AAA157CB62C571DDB73686480329A20B4A673C9D955AB7A61F376D143316B99221B8DC06F20A8D721508EB2904E45BC69B7D0C93B9923B66B0BD5C785A873901BC1BBDB5EB487381905427A99A9EEDC5627079CCAD1C0F12BE9B73B953A915D82E6962F62C8955203E3CF5B14BD6581716C61ADB4082F876B8B9BD9C8BFF942F0D9CACD9EF57A1E71F6AF24068CCA3D0A36C77AB63A284D7E80231B7E10FEB2DBD37D1B2823767F1D563093A20092AB1E8FF9697CA7564A6F3189B2FC23AF4580EF4673625217BE44668458F4FD0B021D54C6B577A1E55B2B2CABAD55B138536199E6582BF6705CDD7E424E702553E0F72DD3E3EC5D358F75F24CBADF1425BFAEEC8932226E36284E26AAD2A7086B586D19535CC8F8E7D22C2B9FAE71EFB1D6F3795F09C6FAFA3CAFA2D8E4A8621DF65165081C6A1C1544DF2E4AC9629EB9AF15EF28286F49CA95C56150657A286FAAA5CCE15BAD2869D5D0491D36B411F0A38A8D82AF231897EAC0E1B3014C2AF9D1B999F0E49E94E6884AF0030D5CF6656A9B4E7E5CABB602EB4360A1A46E7381EC5F0DE56704FCD15E873C12E67F2B77B149D37031CFEC568939B9FB299D0F1981E6341284F742400E1A936C3558FD9643D7B22121EB06484B92522E0486BCDECBFD52E1FC035413F4449A9FDF339396F80C25D0B5E6874CD8A09335EEB1C826A61DA4FF9E7F13E112B12FE82473B461F41CA8F32E35DCABBD3B5FD164820D271C891500CB8603A6BA0DF34D28422A8CE143D715B5CAECA85CA2A705E517601D577020E98893BB108B656411E14326D917D76D9831046EE8C3CC0C829DA03F3BBD6A5EF2DD66822EA76B018E00E83A8C3298901FE8972AA9850E79E62163E7CCFDFA1DC68114CD15C0F1B2CACFA35895FA2568075D8336DD1465838018D55F64148FDA6517BE0D9C3E9803F940869D7AD84F1B27DF8AE6B718C9E66ABD760A17B54DE2BEF5A25DA993A7AADFA10BD5ED7D5FE7806D8E6F7FF5CFFF226238884A87B7851E2EBE3C454A8D46342BE1CADEA0A3B05E5C07046DF6F7261ED831D673C9BA941E3BD6AC47FA7F05B158291B39C4B1DC782D98738A4D03AF3E4284CCDF904B5A32CFC0381E54F46D6D4E860EDFF1479985D3B2A66843F1BB07CF6F646AC7675E7E2A0D9961562AE99F9251AD66937F18B669871524B72473FA5368770F2AD811485AABADADCD205CF80B526543A82540C3E7570105C49DD130C9B8BB7C4F10949430F1E19FDC957D8205A989249CE3201BC916959DE01D2C27523C64C0886D20FC5A0E97C141DD1A44A76BF8D2FC92AD25C916FD91322610D59F29BFAF8DC8144A984EBA131DF584F149069E5178548631EAE2F4C6643AFB9E21DD0E5E6DF44937CA667EC916037EE358F7D0FD9787D1CA87EA3DB17C883AEA9812BBE7CEE8FD76A6AE14DEDFC608F45FA191701716AEC26432B9C260B3F897275E1BC997D9726AAA24F5337E8BD6864618C02BDAC3A33A90F821F7D360759418D03386697655CD9958BF4173929C0D2A81B656869B374C65703445B0F891BA6446A62D902B4F248FA3A4F3B9155A1F46CD45AB32B3F6FED88B41202EF948CF8B28DB9050E7238519A1A42654E1A9C700CBAA49311DCBD44E11FC23C81615871C7973E083F4BB206C033030813E467A0B7CB309081F32DD1C83E9E078E3A5CF06C7B5253A08E38F9B94B10F79C95BB64A9402BDF21EAAF8624976170B9D0422B55C6FEDA5FC0193F2E94B470035C2C9EC95BB306922FE9ABADFBC3F87A5DB49FFA4384ABAC6530D47CAADA896FED3FBB91402810EE018E62BA1A831986CDE59394BA6BE9EF6A1414B068A7772D5C425FAE3233BB5478FB41505ECA49672E94F25E59E8D3CE16DB2C835D2A8FA3735AA4BE4C018AD1FD63CF161ECD37E0870152CEFA3FD19D81A1E70E86706BAD04F35338DF2C3135B8AA8EE7586DDB11CCABB1CCFAAAD5E89D7B5119A1CEECE29ADEEF89B5B5BE498E6A22B1C22C1B8CF3F8CAC0CE7DFB8A675CE7B529E2BDDDD11632CC0ED6ACEFB82198B64B36B05CE0AD7C2EF3C501C6F2C3C2E41068543F14ACD6577F850EC22ADCFFDB8CAB9130E5A107263798B7B62BF1C1DE66530FB999289E26521F4887EF6A6D0DF560F7371E9E49C24CF7A3001B24856F4259A1D0774C5D202A2EC92F46661FC017B7DC0F8577BC1F417FD8058F78639BAB4DB52E5A9378202FB5748F258D8E0F0C3602E9038A28DABEFB252917C184B9B451B417C30F1639142387886C38799D232BFD1838763E28E996FC1A60319117E2671E50447B280D258C3521CE7C1E0A581D8B346CA2B0886994B8824F044AD1075FDE7BD90E772794BD687C720E7DD52FADC89B322691AB6ECDE3C4B5E57727B9B11BC655D45C8CE945736F0AC132627209BB8BE5CC895E792334CD2B976BAC912FC021203DEE7DDF9922E42E2823BBEF92B1D35BA88CD67558A6E28D348FAE24F698A35FA0FFC382463994D8C74767B93F24DD318C54DE01F7FFAC68F4BD0F6654F75467AA6E737A794AE3EE3FF5E0F1BF328FCAED275CF6AA05AF17C5D7FF0EDA5BB00634416A693C963832714EB4A6DF1277ECCA23C8E988114F31EA166417188BEE48815DE3CD19C9702611A3781F00DBC59D3C9F14467A0F1F24C2D4F3EF8E00F54D4E347CC9D918C392D72075DEF691EEEEE1792A3B047C159D986890E02B8213604FCB558A1EC19C250AB4AF887972B6034DFDD4D80FA97B57B12F5332A19AB7ABBBE245DFDE7B349FBF36BABA0B1E016D5202EB1EF125794A668E6DFDD3DC04D952D5473EC4B7000B584AF71426E1C6CB264DE0DF1E75873A315ECCF94264F56534A567CF15A2A38554A83BAD842ACC735901E15B75B51E851FA6A4B7992084F7790DDD3DEEDB4818DF80C6CEC1DCBAA3AD77E5ED336F5996E881F07B4BD68FD5D027F6A7D62D0D24E7D91796D15590096855F9DD7F3B08278A56416625BF14BF149105CFCD40244B114742F7B24CC15A50423DA48B72B33939F8C39E0B43D566FAE15EE39D1A45BCEE69146ED442F45AE76E4CF0D59A6D167A7646FB8FFE57DAFD0AFBB0DF34F6D8C0D8385F6EAAFBFBB90857D2D231E3131F298162FAAD423A830E2790D15314A529618D3D84BBF3CB35E461D1978053A81247BA5CDBD1A06DBA16E2540E63D83880A2B57D1696A45B95C78BB876688560E0F1E97D9DAF88C25B95808B0E616D605B22AEB7568DEB14B83BB0180D8C4A2DE642A63917A5EE6E08851E732AB538E1A738EC66A271F7188F349743EF6DCA9F2271218C1A08E2C0988BB5AB72DCA7D795B941C4BF1D61F6EB6155FFDC6113900F6AEFFC03A0E800169F8BE687ACCB31510E44172A67EE5A682322429244DAD69BA2920522C54661B59996281F6C6D574CA65CB36623F1AFE834ADDC957519708AE2EEA8D44E761A3320C5EDACF594C122E6E494AB97E964FF4279D23342030DE99BC3E7BA415341855AD09932C00C28F20CA1E2BB9DBCFA107BEE3A6BB7FA374530D673A03FAC6A231CC752526FFFF25282CA8CF439CE627D73655B54702215B0B6190E7F78026A831FD10B79C2712600902055B8D04724E7243EE7DC6FAC0B6E37B7F5BF0FD39C7AFEFAA6C23D2E0FB91D0C92FE49D3421F72E4658CA068AAF60782E4CE6315616E54E899810DBDEBBE970466E99D59B5D7609AB90F5088177964B899F60775149147650D7A4A2D100A8169C3F99955DA760E3414D6424A7BA3ADEF7EA56FE080B8C193840D1C870B943B268046D2DFFDB6F59AB9F9A091B77DC9C645F0B1BD4DEC4044460D964A593F2E369E12CB267E7F6660EE7FD8039014F6376D2B5AF820AD34541E4FA3F31BDA8056ADDF596D67F10CC46FA48DE013079620CEEB6A030A36F23CF845081C00C7D8E40FE13ED870C1A0D39D4946621F3F38F9528732891BB9D2D8ECB2B605FD90AACECBB14135AA83DC04BF76B04183A8B98DDB8D70E48A2C43F7B8C1D34CB8F28C8B473B804A6BF1BD0019A3231A7DA12D4E1541EB582562D943B2C48997D95EB37EF817C8AC336421C1263AA45BB95E18ADA3225B63FEE678963B94C228E283C1F367ACAF4DBF4FDA56515C22DA61D5E9DE620F1B9BC0B2B1F0F94EB7EEF60D1BB3F1BEAB79E638004FBDF21FF77115ECE7EA0DEC68944FCE74A7F7D87B12C5D830F51512102CEEBE336DAD9C730C22A7504E7683CC2A3BAD9F45AC759EAD47A8AF00A7D45222EE6B6713F7B0A6873A4A05ED7F6870B37EC87273A98D9D5332FFBCEE8EEFF5679FA36D2565BA97EA4D85E5692925415CE5C8F230593ED5BF37B79F9FE3482EA411CF272BA3783853576DB6525EEA16951A600C40E972C0C1037023938F8DDC972BE280FE494E0198BA0AB5C779D8147E9FE858B64AC52C6D0C54B9356EA97099CEDDDA0155FEF930BCC7B194C87ACBFBDEE57CBD23379DB73259C8F0106EEE62237510A790C1807CC1A0C6A618A632CCAC931CE696926BA9FD81C52EFDBCC4CB9D4FAC1D607837A52E2F38096473558F5F693A80B54111F611D88A7C754826218F86CB04D2BF3BF207BEDC415AF2A78F5706E42540B134B7353AD08F65A20C498547A3853145045429A06EC7AC65B68E579166020C059612EA973A992A934E6DE672C18B20BC0A49D7A001C1F1A53967A4B264B3B8CB16E42D072317047942DD7BBEB64BD45A2A64E7EF9F6D9CD0814D86A635F80736D4E10C12260C9B9E842666802A5149BDF7E607719A20008F08684EA85529EC640F075CE927E84F2FFA50896E8713BED7835D0C5DCC50D7920447306B827BF654B1FD56BC0B55767971C0F65DDF6E230367FCCFC1DC642162E958B397AC19B93ADD3A87132EB41B5F4713BFB2F076D471E00DB2A877F800AEB27AC9D8693759C27567AE240A856B5A76585CED3019BF8D6E94AC75395E56F27AE1C89C655DF677CED7AA535F6E7C8667221CE040E03CF4BACDD747F83D7E8230C4F0FEF1B726AF300374B00A3C8F8B12984289EC2E68CC007FC8CF6803688315285D80BC4F745E62D3B81D3578D7E55B71696D9F90DA19039BE662A5D7ACC0779BFC1B0EA561A79BBBD90A8BA8FF3059440259EB781C75471E653AA3987E1D75FB80EDEC67911563C37A853CBEF039071538D7ED74F643F4B4268E71BA37456D98041F0557268000CB82192FD046CE4316941A5FF7444A5E58AF67B2F088AC113AC66B5BE09A7E7D2387624BEA28CC77F30003B1A24CD27B44A7E8C8031BC579A83CDC485AAEACF71DEB536ADC388C03F4B443D6828CB9D26E5C1ECDA81F6B505F6791A594522EB9A6CE457846965CD8CBA309CE1F45A229CCAFFB67D2B0AAA948404B18703E1ED8E56E9B61102667ED53FDAD4CB75566D874E8AD7B2A7B1D5B701551DB717589CA0A16749E9674214F84BA9E2CFEBCA2570F5B558B7239EC22B6C5763C4E074A8F46E00A3341700C79538F6E2695E1610E2452DE07F9F6D49CB34167B069675CA30B92DB6C3C576FCED30245D271CF6DDA75F2A69B5D1BECC4AB1607B6779B08B4A5C8E0355C93FB28E9980B4EC5730CBE152CAFB5A098156D616E9F4A051E1E84FCA4794D0B85E760F6E146C1383CBA715BA3888BAF0FB542AAA54165D9CF9D0A40E22185962C533A4B0617DD2C4801C790EF46BD9F739E36D83EB1501566DD7467AB23CA0B9A031B6AD48611084166393BAB44071EC74CE3F6124B3895210178FEA852D499570D024B7AA28C319B3835F208F83AC1951748544DAF7E2D801F5878B323AE3EECFBCBCDAF73370959E17F0C8A728D8AC900C6835B72F524652F558B95A19226618711A39925B33FA2E23ABFF9B691B0BCACFE86B75613084A1A96CE6D8927C9919242DEDEA970DD74595D709C3FA504CF8A3A8BF6A2594CC261A68C06CA084480EC20D9771C273A4F8F1949031AFFAB22FBE12818ADDF8EBB57F452D710D8D8DDD441193ADFB9C6E9298617D227F7235AB6FB80FC74C436E63AD715195B68B716C058E0F7F59F2AFB4F7E0B195D49895A2E0D311EB83D40E199EFC8C895B5A439C9C5A019F1ED1F37E1DA9C3CCE7611B7DDACA5BCCC2413B51DF94FC251E7AD3D9A74696142B7889BB1F14D10006A8B291E36483856AF8A80252FF1B5BED5479BC8AA7A658AD60D7F4643EC651232AFEC7A7CE94259EC513A1CEE9538BE7E1280867D8BEB61B34DB8930475ED47F39B9638906BECDB2E82553A048AFF1DEAA5E4D955D6D0D40FEDCC9FFF580842B00FB823B82F15E57409011610814AF2BF4CF69D5527F99AC1435CA28EFB79D1A1039396E45B46EB507690D889A42F165121CFB9457BAA175D7DA853DF6032596279BB92DAAD07E97241A514FBE1382756727AA99C648C77E4089231B3EA36CD8C469BD35DB4914466408CE9F21BDE34EC23E6768F36572370CDE29F86740BD45B9233703732986ABA686156610B1D539E1A28FC42F894A2075925481DC8971000C53C4A7DECB79FA27DB85820AF9D27FC50BEA10E7261B828567B325872B961CA940BC8A9577718B17846137385F5451BB151E06FBED139A5AEDC94A6E39E6AEC4554C10473DCA75FE5DACB31FA75D750AF5D316798120DF7C122ED357FD51F6956BE7FE14323B1AC5F993C98C2D67002B472B393A73CFF29673B4A8507E145A4F25276B71E4EE252D76FFE428580F03FB4E8C6FCD9EE0D59C6B2A1D0A033EFC19300EDA5E86A34666A25A3BBC5CE09C11A15008BBC402620EE69FD6B6185BB3923CDEFA79B5EE839BD3A303C89F69078BF9B375E9B29585F7E9E93B28DE53D066335DE12E4F9549FEF6212110F88B5D97544090A7F2A673EA22AC6DBDACA589DC00916780838790EE91FBCE17A2D25649E39E15FE5F31FFFDF75B6C477EE133DB575146E610777331179A9F65D7844BEBE30286C3550DE93857A9E45D57789B92307197E361DF3F8C532856E24B2EDFFDE552E78CF80FD5FE0C431D9BF22EB531137C390A374742E9CC701986FFAA29CB291D03F631F813C6A68176FF315FFD80CFF0C399D1B441FEC8950FF3A11BDEE0BE28B7C2367FB4CC768B4BDC74ACFB23441B7F0680A292A73B8DABF69733EC9BD9BE7DF25B7E55BAECE406467A55E3F57533D1BEE093CE4717E4D6094DA4190A2AC2C19B45F7FFB081A61BEFCCEBF0B22C0BC50D42C92D87A9B1EDA17A943AE811DDEFA4E74EB1A21DE73E90A75B53F1BFE8A4B1F2BAC73F60DF799A9265D6AFE35EB8E12C34DC5FDFA0C441FD9AAB610E57C1815DDE15A9493AB76160C29579D69A72D85FC3DA3FA1E48A60E6B33035BE27C73C190B000EC953C56DD9BD173E3939AC84ED17F1264B7E25AF5BDB42B25926F3D196197A6225E924A32B282E7DC2CA89B3774774D9DC4F2A4EE138D1E1281FACCAB63DA5BB8C034D0B96FC7F4CD640303EB7963DA464449A7489E2672EF64359C40FF1A6FA897CE72CFEA37DB0B178E0675CE034460269E9CEA69D2660C41125AC19DFC76CA1E607B5130782A860A4662E0D3748A2AA02B9210FCC91EB74FD55574193B9F270C52F6B5360BBC2AE48DC0631972938ADC0580B2612129E61E00FF7CB325CFE4C3D704FB93DAD7F21CD40841E01CCFF9D26255286479E6E98E93944AE002240D4D33635B7234ACC13AA2C5DDC30676328D16774DA5DFF2A0BE49F3B1E4BA69610E1BD7ED1E1A49E91B06F7063A7D349F2F76A8363DAE51BC3FA1BE9AAADD0BEE83307333FCE09033FFE7FFEA542005AD7229C0EBB1BE5557CCAA19CA548640CCC350C2806B8C6924FF9FA398A5BC7C66396635B7D89165ECCD5238271574F0C9E0BFFC623B6B7B67D53AEB934037F08C1B38345062B48ACE53A97D55E50E9D0A617559477629AE09F510C20F11E0932D1989F2C7E06394988042CD7EA01C0F7749A509C3C370741677CCEAFC6EDE68814BE4E0301AF3C8383CAB65DA3DC17E6794ABC4EA67DD481EAC0D320375D2087B18417078A9DA184FA960E6E38A6FE6EFB11A4516EF33EF2A5260F5EF2CBEB171AF902F6648560ACF32A038F03C4D6D1DE235630B606614E0A1320F35A1D30CCE6EAF7AAA21CAD4FA5FA381CC7CE290DE695EC38B1F8EA9240CDA10F4EB1BCFCAF7F268626718D905896104D16415758E3B33085F02E20CEF9DAF1DB697473E6AA56C3E93683C287F00FE6A4806F20554547611CD54CDF96AF702565E4856BC7923FF9036C836CC07876793F707BF51847BFDD22D46E5AD5F7854E37B0994F7981150468008A078C25173BF35ACFE5D89BF11657C15FCA03D53C56CF35BB49B9FACD39AD4012E06E9EA9C02F5F5D9B215BC29A1F66001F2093B3C2180C0F5A44BB8FC1E0D96C5F6C0B10BFDCB7115F19ED233B5C4828D9294F6FEA1A507237C5B153198E3139A9CD0F6B7851A366C1BBC7C070D1A449803D0418A0D86752A1FD25D79A6FF0B2D6A7CEC6E92143322B64FF442E5F1B49FEB2B257EA406BD06AC33AAD89ACF4DA8A76E3B29D1D9D16B9F571524FB7CCE608170B07B2C641B3DD17B6FE3104840D8E6057A4E6E4F0503593880E284BDB02C808681B347F91EC14AE075768F917AEBB5BBFED5AEF7F3B2027447C831F0D839C6B7598E9C38E951C95C90588F31C18807B07D3298D66549EFA3E555A89CC1558F0EEFC065211834B11CDBB9F8894AF15BCC041190F3992819BE74BD02CA9C6A4E5F40E3DF7D74B4A3CEE3FF86538F754A24B962E368AE492437419E37944B422280048AEE750E70311708426001F9288D0BD70C36EF2B14A28C6FA701E6410A7C20D5FDD65ED1B18EE26A5E2C3317E0A47D1B4FC47006B7449C58510D7EBAEF16733D501AB86645BCBEA5BB2D966519503CAFEF9C1E40F91BBF1B39F78AE0FCA8D73CF78E94764F759122B4DD04C5FE9DA3D6E049D76D67145F60D6D845ACA2EFC8D25166C69D6C6CDA61D8020D3C2E66A6BD31EAC0F51212566705D66FBB3116AE6AE19B5247FF41D33D3027EB29B86E3A201951BFC3E61D501BF6C4FCE727E20FCF8A378060961DCD18587E566A315633A52580A3556129CC801F07FE7AF06E5B2FD0D4894F2F316BFF0408F48A255C08CCB42C7D569433E0029112D8551338522EB6AA5AE970C73E258F31D79CEDA8706121C2AA7264F57C026F624EF6A5C983195017793D7E71B4C7A9A714CE863E5D766F0C81AB3446A4CAC3D534958B5208F84B2F8B683B472043A217942DA2989B89F54BD11B5967CE7014A8943BA20D7796B6BF1CD18660978ADB50B563AB9472735045BCC477E015F85C0230A4635C974A58BEEA799B82518575AED6B20EA35D0F56B55BFFB908E099C37B037EF4732963B861DFA2DFB83CAC54C744777A450C13B65F14EDBD3AA54D01857C68CB8F01EBF0EAE09382CD42E4E4040031156A873C341DB204D24294957673E05762463D87E293FFBC35E624FA1E0347DFE2C1C4F2EC0C8E975FB1347794E59E6CF2DC3E7B25D6A62D5FA6C53854684241B5DBF6EDCC10833ADBEFAC1276B0887D79C4CF0097BAE990A7698C8AA4DE4DFC6F00574E3811D8F358A34E8DE83EC474C6E801DA61FA5DA180FEFA7739FB3408DFDBE71FEC39FD13E002878FDBC60200FB5EA3AFEDDD58CF4DFBDC7B35C4B5FF527D5466E7CDD6D81C8A72B7C628D5480832616A87877205C6C24A82FE6D7580C9F52DE72676035A6675BC20C04381E100C3347871A70CA2938B7D027B8D4A7614985A6964A99D631EF0228E89FCEBE0188108BC6D6DA67CED038E8F658009F185E5F63D0F8AE7F15B34A93858F03485DDE2EA8D31A339F215E830CDB136CD6DE3DCE726C31AFDEBDD7BB6D0BDF6F858E8AF0724C252C06639346C7999E12301573233C361CF4E590EB947AF8AC195D79C0AE8F2DF3A4CA806DBD18FD33277FFA920111E42D1D3F5EE0568306D0D7A7DB01D49C8F723EAB74A2E58D0475F7B110B24E0831914A2DD5E0B521A015368B86294995B9EE9CA772817C5839DF23B16042D04336B0168101CB4F3F9B36F8CC99AD74A4ED5114DA481DE51720C7E35A1DE51AE125C4BBC8A13EBB98A28306C5D1B0D3DFDF1A7696C0DCF5D4A9FB556A9C8EC618E74224DF6AF5C36AA1B9E4429923091735AE68D19794C1154252CF06C2A437C5BBB54DB7CCFEA3BAD44B49054B87539AC005CFDAFB762BC74DAB1CAA7244AAF920B6C6BB42860DC7CA68F590C37C2A678FC65B40496DDCDA61CB49DD636DC338509028E6DA60A530C3E24EEE8F09D34A517CA6E15522F8A885E68888C4312E0E7B0E17046AF2527432882CB30B6DD537550586A0B168164C3B8F241D7333BC6FF29E235AAC7C505EC1DEAE24C3823BA2BF07B8BE5CD67730F4FC98443E32FE6B205850953BA59231FBC9408271DB3CF47857196FEDD3336A975FD094E1C6D2D51ABE5F0E5783807E01B1D32F004CAB4BEBEEF2EA35D3FB772452EC01E6C5BD8A684A17B33BA00D47BB36949F13EC822CCFCE167CF99848ABE1760187D3838BFFEC835901ECDFC905E8EC3427FE9A24513E0BCD2560FDB7C32412CD97EF65A667329A50B0011A2CF0AB5FAD5E2679B28231999D2E29F57197B6D32FC74DEBAD09E365B3A2CE78A9E3A9BEBF9044C29D5DE4E727D0190E83208AB1D9ADAAE0815D2194FDC08EB39788BB0A8E7EA5F778C5391FD368B7CC0AF554704025CDD59764D7622E4C8356AE477E0088488A5C44D1B5075662BB1F85A2684B49808A3099F457313CD03344FBF3B92861A22CC52C5073BB13A12D4E0740C60BB941B738E977EABEBF94C30AD8552833037926EC9662D4CFAB0256B9F7893B0E898D3513967200656EA6688B772031DC86C9CC4FA3B3627226AFD4130C8FFF98CA52E617155A4B93D4E860DEEEF416522D08B2F789906F4DD317B570A83EDF10C4B74B03393409476A29B2FD38DB9203F6FCF2CA2F8B3DD6795D57F7EFFC6B3FF7B4A9CF3576524EACAF951C53B518B2BF1357286C22A88FE6CA47DB4612B29D937515FD2B408A4236E9CC7F393F85070E28C4D9DF4D75313C1BF8D598A562D521E771ABEAEBAEAB29106B2FACA90DA05CACE59A13771B8F25D8D6633C28B5688A622E7149AEB7F84F3553AB45901E6033E005120468E981D1517491EE8FD4505B96A6160BE6827B960AF32E2351FC2DF5B013F2829768AA68538D51201ABDE34539D5B260131121F91EB2B98ABD9FF17BBEA0695AFB6AB1A8F52B51BC0173AEAF9E5770D40443852C737587B8673829EB2196BCC304984B66417AE0567C16250D7BD4214B42221CD11EE9ABDF6BFA7F67F2BAEE9FB8F662347D7EB3917E7C8A0FF1069F0190914E4208907CEC2706A6543ACF77D23AFC529115D46302CB313C44E1E5AE27197E988B2E3E291DE0210F55B60A9ECD6A1587386FA257B94346AF7D718A8A63F684B7B1BAA34BE3DF4D5486DE7099238584EF31056B765607A6C1152E688B16D9591D8107ECF25DAE071E83753DB4106E2D39DE3E3BABD3831CB71705218D67FF8F34932D64A55FD4C73490C57F295744502EB1B318D9104BBEBA34269395D86013953F03ABD89A0094C32B68720649671BF470465DA5EE56A4407DDEB23391EFC395FE5DBD5D759ECEC505834F57FF93F2664458354487EBEBA662E3EF485C28AED2D12AF75659E1926E6F31527E5DDEFCB3DAF78907229295F3F0855ACA0EFA88758317B883C2BBDE247461557BE2DF5C56A91F8AC34FE21FA17A4D6B22ECEE501DCE522681D4143AD4A86D916F9FDA8156A560EC1AB61974FF38C8D46DEC1DCCA4861E6E8BAAE92B0AC27F96765223C2A32AFEAA0BD073011166D44C5FFC7AD04F2D50890786877A19B88748086180FE1633C2D2E95CC12EB665B73C1639EB261818B3F0C06A76B5E51B18DAC5A5CE656120F2DF88F47D47C426ABC4746F70ABAE9597D0A504EAB12BADD7FF65DF01F3936C26448EE6457A66A6E73872973CC139CF673DD2A8A60EF4821724A9F6C91AB2504DC096AC368326D1DE07602153A00515C9D3052FE1AD5D91850B952969E16E9575A134F83C2B52B652E614D7F77765EB6B8E903D50DABE22FF223E4F0605639589E9C1D796FA94E39CE8D53AD1CB2356D9D1A1391371DCE1F6F80636B41A4256755730702337D018AB268C2C9F8AB5E864676954753E833325B5529E95ED016EE2A05DDC128A9B5030DAF373C7DCDE5E1538BA6C6D236AE59CD59D31B3534AA6DBFFDE21AF8B9602FD3F2FEBA31550EA9F4BFFE98DC1AC2D120830C88CB2F893005DD7E446CFF7B5EAC8B696366A94D50D8190C4EDD44AC94B5AA5ABCF4E8F6FB21D24D7611664C42D92988405C99D1D553115C2746BEAE71896D1E2625CEF840DEE64DB3A5B0D199569B0A3841CC8BBB7F3478FFB4C6683483C9EDEAD2A250066571DCE46446C6B1C53385A92D473EDD3D8C8938087EF6D07FDB7340AC3B6C9E45CDED17A882896E8E42D12E1E9324E90CC801E197391FE6AA7921DF62A1D74B7A00EF09BFCF7E1DA607EFDAE3297F0F9DDA22D618177636F2E61CE11C206577B5E97AA301EF3E9188FD24C83A5EBF0D774BC2DE770FE4A1BF00AD17B4498B4B53F754CFB4D78DCAE942AD92FA84D36036EA089E10CED758A4C48447B3773FE1077E18D302C44C9502B7A61817BE55AEA1043BF230A357F4FA3B9C0D9A8B13670F4020EBCA387EB77E3DBB42352F061BC05E218E34FC49F64710C88378441F8FC63BF2F62EEB9F28F5994370F54B2D4835583237A32AE477CFD2459A6CD2440F3000E84E8434878E9F580880FDBECDBFB1F75794B187F0B3D5832851CE012CA2024E34F69E5F320056D935EBF5F0C5597A9B621E3FD7B57EAA88C15051EFD6687D45D0762B067DE8F359270321774A9521C55DAC74C1057D010DA9C2298832257132343953D1527A8722253967668D2F6D3D2D6E0467588152042207C791FCF314AFA09E656B51CD5DEA72E2AE92837875C148822026F9A9050616DFD47C768C029C5FD4AC84B55F7CF1EBDE770DB234BD72EF8C81087D3CF560EEED9D4D4AE14AA9EA3757DA5932B5913C51EC3229B22A9A4E76D4F14968E3A2640433928C5A8B771B89666AF0D370AEEBEDA470CBF3F1A3D90573AB576728058F91BD1C0719A3CEC3B8CC1C230489CAC6737B4B26CA70080A1D5D58F56FE72D364E716D2DD129A624C8F9708BB987F25BCAA8AAAA37389BE1BCCCF5C238C677023C2717E3979B94FBCCF2387598B4AE4759D0917FA8BD1D024F50D93446C8EE8321EDA7AA22DECD6C0E435CBA7BEA00B12B2FF933535C06566D1A77436BF73B8D4E541B0C16526F8480FEFB36421E6E8166CDD329051AE2B17687BB0282003971B3A6ED6F25E36795473DAA4D2F5436942889AA25C9F78914F79279F6F7DAE2E23186A9403E44A19D55540A2852BCF0A4D8B3892530903D5FA0C7D02F70C0FC101162BA01636C629A9C7EA6D019846D71E9C7BE2901109BEC9182F6C5FDAA15AF0F9D7248FF4C93B8E3B7B26C22DC3952AEBF5E9A6445C9278E9D6133CDAB5F73D68681B9464AF05CE1127E0731668666F494C7E42D17724E6FA78217B4C54CE3D37B0062350D714F712D4D300695AD3361A1BE14AC753F131B6F35ED60C341DBCE731F6BD57730FE9D6AF6FD47AC614647BE9201903F35FDE5D674831C263B0DEC59A5545316EC5C4BF0659389B3DD6588B559B3A864B591BB4C4A82C5E4870EF72D6BC767D8273244069ED047B479A51BDA24D1E64886D232CA6130680040E4591FBE4150A2225C6F7BD5FB4E17F18339ACABDF30201C9FA2E59BD095CBA000CEF206520B0303F713EC944FA952E4DB3E30A399A41FD16061772100CCCEF357237B2BC034EBE4FD7E25A2E09F210BB3BF82CEC16A567AEF61789CC64B10D266AEAD04B2A67E59EC5C3BDC176E3B702E69C852AE6CDB3362D0D040024E99A471446DC81039515231F2BCED51F092EC3A5013E02A8B50C4B2B82C86EB3EC8B5C980E88FB83E1F1DDCB3DD2EEF2198E2D391A665187CE882F1DCA248F1AD2EC7D62D4F930D12E798E10C998EC5769532E7A13EB56CC13327C9C4981C165D8420545B932585548617998BFB16D3EB1D9F760871709641778409A6CFC4D7DDA8F92414B49DED04C6E0E6EC91904454C51BD89EEDD05A4B545316EBAC7DEA61930563D1ECCF40586A2F1AE797FCE8BDFF21AC373E88965E181391F005D0CC1A77EA15603891C6792C498D8D1ABA5E0F9B081CB7E024163669E03678BCB60B492BB8E5C8580696D7A8FF9803B1F341FA6DD93A7187731079FFDE8D032D0853D1EBB39B43AB5859F713FDB863FAFE3138C901F6BCCCAC2A2E6100CB3DBFB03FB5DE6FFC5C631029D4E2B991C7CBA2876A5597384C23090E5B2158F83C484A11F33F8086194FA93F81D744BD50DDF9AED457FEDC312180CBA061ED8040AD5A6AB82B6EB97688CDD85E4364034C22DB1DB9C21FD59CEB24F5EA6950BEC272040432178DEFCA3B1C48BBCBEC0B8B18E3F73175B5CCD58E4928C0698C846AA6D5FCFD7492B10064C234C88E1CDBB060D06BC3D130BD1107D19F3DC44DABD19F6AC31378E349806666CE2E1E44B74C5409A6E48112CA45AD6827F11E94D7A1BCC53878D91BA753487FCBC21E01A65E5FC50CC7A94C0A1EB038F04FFCE765A5EF15510318223D1D6C826F8ABCAAF074B4A0D61846212CE16AFB3E6464F862632FA65B39F0F41043335C1B80D7201E17591E37F4EFF2198072E1FD03F6273B7322F8C660B6418851C2909BAA401346A7DE3DC2EA144C9511FC380330547CBE95AB577BA92E6179FD3AD1A59C5014C0FE0CB7E8CD25EE288B6FEEB20C09EA99B37F03FAD4529F650A010CD46B97C0F29F99B0127B15FD673088CA1FB8FF491552D226F9BD2A3510482F36E6B6C4123F2891E387DD9537D69EF2711368F2C654C0F785F5DEE2CC95EC412CDEE48A413D4E384055A17808806FEFFC6528260E9C40B1916E3D7BEBF8A22209421D7FD961731FD71BC1E3ED56A4E4E81F0DF9123A309C8D7942AD43FA126E64764F16484BA56812EB49A8B912664027BDB8DDB9679380090039A07704A25C49F7D6B9962069D811FCBBF16E759DD30BC4CDD426999342E12EA2E81FEE51E56E67D696A4EAD4478B14ADF1CDECC83649B28B22C954B094EAC6ABA9DA36654DCE233F4BDE09AEA129D78CF695028661E9ABEEB5944FF01C40BE945D811EB73C6BF00693228F23159D3A2BC907143BB5DB2FB2F5A9BEAAEAFB513B61184B16F0D58EF6F77E122AB9F16C2E0487D01FBC998745575895FE11C408099A312B406720C34F266B1C7A47A28C5D6EB3A288B99C40726146C5917FCB80CB37BD9AFE5AB16B2A23BB64C17305A864CCA34E75803284F59869F98758A4189F12110293D7CDA5E126A04C4F4827BB7F0DD9E4F35C5E1590E44CD3731AF98BD5121140974662CC9A3D39AB74336B79F5F22513106DD970DA639F4771E5291432D58F2C6A37FE3EE2BAECDF392E863FE163BD187C696A8D75DAEDF10220A4F74E0071FFA5C4BEE5C9DECA65622B9FD16E48E0FF86521B084D3E3BB55A4429CC3B7D739E51A155DAE571D7A0DC66FCEF85AD1AFDEDA41CD94A213EC2FF246310D2A0A150AA9C0A15D00748EFE30240596426DE5C973978B6C50F43FF5082B57849DEB861489E82083B0441CC7689C6E7779E9F2189DE6B1BFA30A6D6F918986F3716E98923970783F2ED75ED47EDF3C9AFF771D0237E22E3F9002A9BABAA4CC360084185FBB9F710B2ED3B7AAE929FAB1734B7654B096BC2E64DCB3C4D3346B25F84702D457F076A2F30EAB33C286D912FB4D12620E11CA7A35D83922E3980BBD97FB3A5619E6682E6E301151CAC072CF08E04ED990C843ACF8B0FB489B6795338356122AEF2CA069EE781938A5057D518A8A248087F85E5533E6882FA3452F35561324CDBD7D78A17057654B7A35189A66E96423346EF2E19141BCE7449C6D60FE52CBA1E4BD201945A7D122908429129AD6796941BA4A12A5F3B857AE47C78B0B1D0808ED6DBDD749D54291680163299F61DA4BF5B91B3015C01713124BA63250A86AD30BC3FF19C75B37D8102837BD369FC1CFBA2D80AD3E0C0E3048C3935B6840F0A0B41461ECA988DA184DF9C680DCDDD0F0346A685B188B2ED943EDE6CFAE53BAB364A1C1A2D1E778CC8C7C981E297D47D6302005BAD51F7450D3DF18912C9D6937C6C26A739C805C63FCCAD72B78448019D8AB866C531046251B6702CE87CBD65CDD5F03AFB18656E36F63E32AE9CB67C2DBF66E42A9AA15C3E861640FCDB3B9BE82961D2CCE3359892F8313A36043A1B00B538801D648CEDB02F43D3CE684A75C4A188AF1348BD5F4443306B249705A16352683E44EA5EE41B1D95E2ADC7189B6D1F2CE2BA77ACA3B6C4465AFEE1D05935B145DCF8E13DCAE92B99CBB76F4CB7FDB838D4019FC411CA21C512DE6D85D9527FE39CBC154BE8D600D06C11A26B142F07761D89CB84C9B86F378B1437E34FB71B7E06A656833EC31195ED8C65C287875C67B286C35DD8D2CFDAAFDE5DB3719ADF4E5081E45172F2E422A8D6D222EEE2782D8C684FF92086B13A1A5239ACCA77E1FB162DD0C9236AE84821F8CEC30C32C0A153CC6590D779833CDFA20A8135AFF4474CF751EC18401BC69264E3CE04F22DCEDC4C0F8A060B89503D5A4187A1E97CC7CA7661840CCAD24B1A0C506D5F43A4EA81F17ED3EA791AE8CB50909D1EC03DEFAE424DA32424E5C7C15C11A628205EBC78A66621553F2CED67028456BDACE57D86A189870398434700C12A1926A3A40825A332E0F7A0EB469CE95FE3650FD1FE31C85ECCC62190DFE894FD47C4D352DAD00DB0639C4BA16E9F93CDB2B6AC156E44C5E747F7C4B356CE938332A6F5ABBA787E2A84EC607638C24BF19D8F06FFC245C81D826A615485E2E07F7004B25F4243FDB391EDDDC11DD0B63E0DFCE6703D1BFC33CA6BC074797FC39A620BD9B1998BA3FCC148E1F2C29C33C992737DAB783ECD23413CD86DE41E78213C17C3EA93AFAC2873EC00B81FBACFEF521997A823C9E2F7933FD7151CB709C31D181F6AB9C589C3FE0392DBAF2FC663AE4534F65D4894AF9F1A7E6CDA2F0EA1761136D5E6BF6B78AD6E6BBB78519292B81029FEB6637E3CE6D2555AF4DB9CA5C94BB0E64A54B781EF2D43BA5D4AD2F938F63B8E2D0DC64FA1C96B224163E30A134B4C66C6428CB6C7EEF525D381A823A555FB4C75ABBC140C465C2B1AEE1DF8411729C57CDB3CB200BBCEE5A19A7379C42CF5D127154FE4653FD04E1EBC4C22229D6E2F05200E941ACB013D94BF899D32408B24E33FB936B4A1FE98B2C2A2944FDB9C4033C8AA35A9B77DFA89DE336F1C4038790CADE3C63B7F146DEA3D72205E55F0D3E1065353D876FDEC569C8BA18509C89C9DE6A6C14EC5C0EED7BE8409C0F92E5963F982AD45739CF5DB8C0CE11CE888888918AF02FB76382EF6E95987FA4376F01AC134A3A542D03B2A82AE0F54DCE296547A1A78F43AACEBA891F7AB51459C998F811DD5CB50D00CD9579EA414C5E4DB37242518818E328AC8B5EE409D9F19789016B23C44EE123E2F0CDE7B6F9B20B9F583D0BFFF9DA8FD3ACCE9064BDC2F370F830AA5061E335F9FE39510304F5C16196B32066913288C4F6FEBA940065AE918CACD2BB23BB36770439804E08DFDD9AC89CC91B10FF77067CC52EB40D48379C476573707C0698D0D0FBED05D68396318E4069E384F3F44CCF295EDD9729798398AD0B3B22F68F935985267A0EDE208CCEB3EDF70ED75875234B6F5560054E1E101A266625667F4EA17E715D003E7F7DA35B7E05B184EF87BFC4119557011F32B98911C602E4DE156EDB0868CA33845BC759A084A11A8C6028E1A9A114958F7347091D223F3A4F40E11429C9F582EF9B84A884CB7EAB6BED5603C26FEA19E9F133A37EF295CA9BBE1A0901C23033908A5ECAB12F449EB3F2E6E753C30B2B19F015E048271FFC9E58D1C7F47D523AD35B8CD793065DF7D04A40FC50E06F938B45D2BD85AE6ECBE15394D4645D3730B9BA590EF90025535EDB0D20939F45EB10A9F2F35279E529712790B09CDFAB681ED25BBE609E1261F8203F88CC37C4897DE56729C67DCD98318DB0C5236FC75C8EC1B171461FF27EA74C8613E669FFE1C144D169D96C14826C8018BF0599038321911CAA7DF4F354F1789CA6178D958C44644EF8266E541A457CE32736294E6E95B7C3E5FF2F713CA6A4F814B77D6EC89D1B0390C9DF49C05BE2A9F322F1D375E58EE9E4B120662E885FCAD8053BBE8DFAE914568FD48C30478F709BA4D6E62E9C5E332F61EB81807DD6B2C07AAFD5E5BD98C27B3300561769ABCF993768E8261CBD7EBC2F0A377CB619D1DBFAD64E24E4D890169FE88CA118E391B310CE892A296271DFBACF6E93940C980D6ADB4228267B9E515F69844C9F72608BB40DFB20A2D67A7ED848DBDFCD30A61ED2CC6FED10BE97F23C217D3A7B55CCF5052C62C9F5AB59D68921D603C7B71EB0B7E071D64B67D89F096DE05D6A241502989F4713FC03C09B509E4D7DF8B24E8B059BA81558371BBACA268D44A7BFC06C0320A7715C61CD8F2D7618AD721E28BD4A6914B709D2427267F18AF672741303FE988390D5DC009D876134F026ED256A8FB82BB8333206BA6C7B3D39296DCEC07ABE34CF665D93F9970171E86743397690964D61E752615341CDDCC72D3F27EA12FAB2C1CFAE77903FAFB6A87A8C5C956ABCD76851E249D522D554D06DC3C1A023493A9B12ADED48A7872D9A33A7E548783CC43C31A4798A520862F4BD2D0274CD0F907BA4F77FD500AF8FFDFA4235EB56D5CA9A3E96F5D4E6BE7D967012B59C972783CD8023FA06099EF7E9CBF04BF92925A5A1D52712D23EA93388CC6A0FDE17E34A4F130AA5128557685349AE91FCDEF7356739C67E8406055B44F6409B6F86C070A76DE40B1CB4BF6E34F9D2C0B1AC6EA91B0EB8A6C5F87872D3DEF7CF1566904550366B3622C72172B3D9D4577324AFDA08F68F0307227707BEDEA4C05D00AAAE3127C84F9233CC47B144F0329F9B3E9BDDBCAD6F2A37C9B7B0AE83E114FECDACF6C8307A072B3C5534761C3AD5330B9D275DBF629177F856802CDD430CAC4A06260B8EAB6A3762169AE18535862C72AA281067AEAF16A82407DD62B52A0FBACCA1D5852B000BA6236CB8C90C4C7E9000E2641C0D52766ABAE9312F03252FD3401A9B78066D1F9D9017A94DBFE6CD3B2C4114D03B6D3D11CCE167151E408CE5BEF02771938AE121A13E0BAF9DD13EFCE8540B90F3A54F6585FD2F5885659DD78A27830F11C21243BE1575CA1D939E3DEAC90BFD33766A1209122C70854D6D255D4A7DD789EE5710DEF2E23063F157A3892F6B292B5977F0AC39E77F8C94B3514AEA20BE3F89EBB942502E91753FA87B5C922142721E7027C0D0AC6977EEAB4128D4C074504CBD6C9F380F0139529352E37C6198601A2A0B0E83978C41162626406108255A9207EACC1719080782341DB5319A73B52D27F18EE15694FAF16666B66D7FA75980173F0DC01DA3E8D5E173D829103E40B81452235594D68359B7DAA30B7F325E191CCF489FF9E38A5399BADF634A0B8E3BCEEC60FD55CBB5D59CA5D8BB15B0AF68934B00E518BE526FC78E1739F029B8A4CC9BB2F7F5A9645AB4CDA28081572F76E02F8A55923A4B59E0773CE7574FFFC4370E90224F774BCC615F2405D78D572B77E996AA6CC37B0E1B9A2BF27C67880404D8B285D45FADDA102F2808F770E0424FEC81F5455DA9A446C8BC1597233F7CEF8E71246E6DAE5BA5289EBB49693FC5DB014531F3CD0A76A2A292DD0A6F83A1CD4F8092785CCF571F6864D041F1CBFA915F12D5F3E0C84C5317E9E19F2E9EFA2D0E2B6940E5269C724F50A9F5DA73985636037C1E3B4530884FDB466B4724AB45310E8CEE89D1A8C5F3A52B6619B8CA4060AE6C109766EE95019F96B8E7575F98DFC10880C07AFBE6B549A919B5717C50C38BA558BF92AC3A6EC3CA106AAB3D91AC6036E93A71B15D43F7F9C25C9161103AC4235615B12CCD9FD84508F19886478EFD67E53AFACBDAAB3AD09ED0E4A48A0B81C11EBD7E92EC7F2368F7F3235E6DFE1251D6761D75E9FD305184AF9559B3FFF63923024EAC69AF83345D1B631B65F486968CD67DBA901C69DFA730B15CBC84FEED119AEFB4F5CBF4F5D4F93A6FA37B61184E5B4E7576E73095B2BE520C16023204072B504ABD98FB095A58010F013213110CDB7ED6342376B1CB22381F92DE99F533249CE430BBDF481BDED8639BFF7FED4A37D9038A6797786D2CF13BE9C2E4B81F2F1DD340E8D7B610A7F3EEEF21A34AA9CF685FDD371A902CFCB4E8B367356A297399473E2D477F44640D588726E7F08D0F7BCB4E9766F182382B33F4B9F0E090D4426E503286CDF416FB9BA92B6A0BD081BD4C9CFEE843176219FF113BDD0BCA1F2515D91956F3FFF043D619ABF4595A6B2A5324F794E7B01D1E901816A412722E7C814BC67584F59DFBF599A7C90E332A1B185ACC8C7C6BD14EC68420B144F01696F816FF5B8CA7E833860404B712ACF90ABCC454FF417EBBB4AD407E5E847F98D3953F6C32829DD90516F07FCDA09A34B4A4D72F7144F5A6AF3FEE284AA13FBF2CCDEC7D12904EAEF3B60DC1EBA0F34BCAEAF643B9DD017EDA1D4E07557A9194275C2A2A4A269AA923E7E6689CF349779D548A1C469567F1E5CB0E2F13EC3F9FEBA13ABA88EC5EC9633FC65993CD9ADD01418EF9CFFC6A8145EA86164B0A3787298C667142625EEA140D5E74A404F5B9B6F277EA7F7B679F2B14549DDF9EABBEB44C5234DDBD7A08505461EB825D51A688902565D2476E3D571262DEA4163EB275D6905EC42025A7FF8A562FB1E57B47EBC4132C6E78D830D53011A6DA61678FDD55B5EC63EA41298107BB9CBDC2C2B85FD18AEAA95807D8DE259FB85431F79279B96FD7F9926BDD8C7E0B3BCD64D71A94D274A80C350C3F54A552AC9A4C352656ACAF549C4714C077AA759523BF55F9A9E8F6A6CD4E6A4B9B188E8219195A1AEA584F361CCD939C21C9D4BDC3BBC849CAF6B47D7181F16A2A0DC3D05A57500DDE753668B029FB1A8DEFD3F5DE0274FD417AC3B0F0B1716C341E4C99A0402BE5CF3AE32898A986A91EB9D24B39A37E4692D7A604BE818AE3B4BF45EF3FE8DB8F57532B0DFF382AD64182F1838692C04AE6DDBD6D37623DC0135FBDA07879E0F1D907085C30EE99E9C0391672623964C57FD12AE76858E529B8A9C67D944CCDE2D048A15A5E6E9C933DF938133DAEBBB03DAC7FF0850AE5842CEF8604EFA9B4053AE17C2F62437A10DEBE65B5FC496232FA56ABEBA287AE703EBB763BC980978327327D4D5396C03DC638562DE7043C35F86F750EA65CF17B7FE7FF7D5280FF941438BB35021269CB4478CABA9233DEF282A070C858A2436803B5918251B79041AA8D09CF635BFF0030CE2D0F30D868F13D8A9989F3EE0BCC25D648392F33F7103EDBF28B89A8D22F1099CBD0CDE3C109A90481E0A9E0C15B8919F63A0888647F70BE9AACD56DAE38FAAC38975251DAC3D5BE4158C9851DDDB740D787772770F0F5E3D7F519C4CD8035559170AD11881C201B29E33CB9DDC20C9EC534263F552A1B0220A6A33E0C6BEBF25A647D9BEB1A172797549208ECBBC36FB19D22E9F52FEB641D3FB6A7B9BA77ACF0D04740EA849518D9B71EFECCFE34E563F98A8FB58E57A0D3E6EA0A00B154C8883E908089FAC6BBAA7C28FE6CBA5CD6E8A61774BE0E30617C257E7EAE32A00E2C06E95F91FCD1FE79DC125457D7EF3CB3FD194BA4BF82DF788676C377763FE5E5C49B817E7A264A032BFDBD58850F28F6EF35D602D2511FE3699AAFF105838BB9DC0B78719C12ECB6ADC61A54DB2E31E86B04C1A8BB95CD2D387A2518A8F82BCA16699BB6341B4BC117D7020741B4C6EF2D602124B1297A7441BF4F18582F4327262E4A2716991376A11BC6CDE1ABAEF80C90CDD2C850803811C906AA6ABEF3333EC3628AAAEA218D727DB46AEF22491063BF7D8514B22EEA2253554B8BF2A5000935742ADA369DB1542789E4357CE92344D5C7F3DEE61F312AD1735DD4C1C8081798D50E911A9FED7EA86596C2A671CB5499382F625310CE25874854B43478944E098D991F156053101F1672083A8387817982100F982067B54F7939E30D57C99066AE8C93B60DE8FD22851C91D97CAB74F82C0FA816014B338CAF511DE95268C4ED057B6E1227B846638BDDAA5119073444AD401276250D72852C6531D2F20DC53497AD6B18C004CFE37F6607F7D07955B4C46AA991ABED048C80C09050A8D65D892D0C84E6DA5E8F5DD10D329C4416CFF1B3DAD94C38F7B54885842D13ED6A4F1102BB8CAA9238A392780E9B76308860E1221EFC4A53BFD29745985AD635B3FC525EE7BBA489AA9B7A5208D2332FF3A9AE9A85203CB36099171A0FC42381A169BDD3005D8F46A851C7B5CA5915548B69087484AC13EB5F93592248C0138BF9D7415AB5ED020F09E9ADEEFF8AD59AB29E4DD4096821EF6223B9268F477B7A14C7BA5EBB1F3FB436A9C2F0394BC3CA95EC2C037CE06618BC6815EFE46FD363CAFE0B0E4EDA793D9AD903BB8943045DEF09A49D8D179B78B0FD75B4CFD3C389D2F774E720203257A5FEF44DDF6BE142257D95F7F90AF77F65789E015E78252B31A103E98193AC6BC56CBBBF7F46E99650AEE2407A82268162DD931A7F933471F946898351EF29A4792097A22B66A5ED571FABBCB2FC9ADF033F69020997D3C9A4D7E49D7CCA0F4AF33D9D8DA651AC7A5FB4075B45B9FA517EA95DBFA402A6058F806FA9A48568F0C7A1223C89CF54F93A8D412987D6344611E460A70FB06CADBB005C3B6FC28D1203C4745352EF527EBAC405007FCC33484E6CE871B1C25638F9C336A5C0CA24B01D88D1E103FBD232EFDE4FD2E7A164680F1D3F528C2EFAD90DAEC6E3D6DF5A236BE1FA8F2669F92D7111726979C000764A0F7906D35D394BC2F21C6CDB3918CDC7C93E52EC76DB3E92D2AD6ABB6AF77EE01EE18A64AA45DCF430FB84D500F8811CC32ABAF767CCB0EF22B6F62E3FC903771520E51E82FEE219125537FF8316ACD2F300FC94512CA54CE1C68061B8277E1BB4508E003DA7F8274B9C2148EA4719B2884923C2082203ED22A463F9A07C166CEFFE4625D15A2E690C3D8EBFBDFE5BB8B32B85B1DE582DF00638FBA93EB700F2B19818521EA8EEE0481739515D22298B94EFB870B6A92190146A98F5657A25724AFFAA52BEE9AF8E0CEFFA1404DB27805CCF47B9A1F8817E830ED46405E7DC7D1BE3EF3B080697E2340E47507634E561A77E9F18665729B84666BFB31D7452DD25DB98724C66497C0C3F57034827EB85F1FAA34814E787D2ED76D4CB7A04228EA0313ADDDE400B377FCB16C716BDC71E08A33635D2C0A4A2BEC0F7C8013B5849D8014C2231E020866722CAEDDDFF4228EBBE0D68E72F200CD83610A4E3CE15983B6AAE3E41BFE92632438EE2D2358358CB1CCB69C960DF09873CC9CC1C766A81CDD51ED9724FC06B6DCD708B5A4688C19976328FB762EF74027786694F08B2DDF3EF688A605E3EB41A9E59F7748C5A9B53323289DDEB888569C94DBCE7012BB97D93956C2B86844136C146AB9F983B905BE8E70DB991AE43B689AC95A7D425DC3F1BBDD456A224032895E12CF7037DC878B07A9686BF77A35D5A5C222F29D413D64F4E71F583ADF46BB6FCE0DDCA51922E1D220EEB41E2F09A0662D5C8E97E1D81FABC5AFA0CE9844AD4D4BDCE7C6016D8A1C452A1B407FFBC58D5D9E7C701BDBC8C666CF0F09E69FC345A497C822C956C235A1E43D987C630C540FFB4494CEED53159689F74D2131924487B3FF08AF6C8E14E2BA15C48D16591DBC27D1F774D8AF379E7C7319EA2323ADE2CA17B2EC53AE2D6B3F80E80937179FFFE04EB048E21D01E4DBB5F860EECE71780D706D93526285B65429A60FB8C34D9B62F9F9CB7A9EAD204375F8D8E2EC1262593D3F8812F4A3BBD15C444094378045D3EFE89A1FECF91B72A0F6FD1EE971A06F79B6B2C4F9824F7B6643221D0054F543A430CC2F18DB81BE4741D82CB97584D743FE3B7BD248350EFBB901BA4BD6BDF0185065931F20209B710F9DADBE65DB3D736963323D22A6C8874F1CA67AFCD3FB3F7AA7E2EEA71FC4BC3A3CF9107773C75F5E5D86B2F2FA331854FD4724AF4871309625D7E11BDCD2E8E3EAFCA85E98FBD6A7F44B9B85875EC4265A15A0CEFA1CD54E67C3CCDBA0BF7109D98297D8DA5A8041FF3B154ED586042AE2424CB4A9D070E8F485325F2F83EAEAE2A6A38FF3B708C7ED052F1BC1E28FF505031216816D856360542B3C38547F903EDF10133BB79E0719D1483F28670B2D51EB9411A562C7D28587CD5AB16227AA6A4429CF53BDA226E55B1F12F243BBA1837BC2C6582EF38780FE34FA331BDC1F565DE8963F087B8A46C90B2C205BDF622EF7844EDAAE6CE61771E996F2A16A5C801DFA84206599CFE5AFADE60891477C11465ADD7588C92836E1DB3987FCDACB59AFB412C3D81802F4D5A2F421CFF056264E0AF2D9697DC89CBC0DCA71DDC591FD29887F2C8141C1B6BB513E5D7E4680C90E76AC9912F01ABE511ABFE7713F336C559C00C477617F6D81B32B04C1E1A0847320DC452CD7D51FFF1E8273E0E5A64CB19D42BE409069F569A429A112A3A820EB7CE3B8A5BF47F13B624033D287F4B714745166C74BA2990127A0F975FD091248C9223EFF7680879BA6067C0765F95402EFF9547815111A25CBF4AA1D94797FCC631F06ADC1A1E35AF06F4490AA3797DA65FA6ADE3D0CE758434E5DEBC826F5413F9745CA1893FE2419BA32922BF8041971D5AFE081E2B489E5D259BD2523B9FBDCB0C6E15B0830B80608EE303F2B5476EE7D41DFE7ABFA6E5E38BC718F2519AE977BEBA9D61AEA11D7BBA6CD1B78B811291C1FB4DD9C1B434A051278B27D7D6E9AA046EAC53D2AC47B4EEB47AE72D72B84E647DA99365138C8A1E316F4C7DA1B791545E01B64AD3836FC82D5F6494AF1BAC1808218FBDFDD3B8F633F26E71AED2CF976A36D734FAC6B5E49F10F10B39EC57E92667079C9889A723AD078AD7F6990946BB478584C3E86A69889C281EC9440E43BDAABBCCA1DE1D9D3DA8D0FDA54422CD37EEC80DD17115C8635E618F65E819F9CB84E28630DAE5E53FBEA375E036FC5160F9F3E3045298C242AD57661968D7038A7D5DF3AF2D294CD3812AD747BA41A33F83FA77B098C939007565CA09F061FBD87D1D09CB5BBB1F42AA3FF08C9987EAB350A56DB13901FCCD67B8CAC4C517C2DB03FA6286C855D8AD41F487CEB5507DD2338BF94FE742558F6CF1AAF8DEB1B6EE3E9C85EFB0F515D92670F2B1C46E1DD49831D79DF8B87B30F27D78D630473D695A913AFC6C7446AA93171598D19F6DC29B10BD11484226A33C9E0912BBB1D0A297FFAC54C6F1D5EAA5B8A28F9E0810C46663A885DB70FEDF0D67E38ABBBC26B109062CB1E194B9EF09E27CFBDDA03BEF099D813DC7E79FD20E96319E5C3879D9CC8629E2A272B6FEF7BB29AB590DF2AB1FB87273314117061448965A338C95F218AC02F404F9D8FF56DA62F2D78E696B46A7120F28839022665F4092238B4B7F8AFBF8CE58C9F4477567AFBB63BA8D10B85CDD3262FD47CEA90B3779E6AFDC37A6643D499BC2562E9A98F8ACADE147B22EDBBAF687176DBA845953CE477575FD2CA7F0628EA103977F9C456D2C6E3E1286F36BCE3CBA6092E5A238B4BD46CCCB27078020974D4FBC773A206700FFBDB25623A9D12BD8DB5C7638452B73D6CC30B44F9C73FA7CCE8E26511A7A5FC4A8C17CC0BC899C6B58A7EB4F00F3E64AB33574D75A0E4C563B541B5FD6DF598B45384840F583CBF629479E8FA47F4E5773207D093D0E7588786F2485D569063AF6AECB3B019ADC525F096E05D6829E09CE351AD872D80A361A0800280AA3D965F6590F93FAC003B4672F5BA55805D8F9D91DBB9F8CADA9DC3FA2C114A42F9AE617C4DA2B7C4B759B33EDD464BD7BBD0315B671A435960F6057FA3734FA6825357F392D3D31FE20F0FFA5336D5CFB57FDC6E03E873FB3E4A3307D862FA7828C1DBA0E0532EEDFBE1A61B588C8809BD105A0E810CB48E86A0880846FFFCE56ADA16817229FCAD2FD34072D28895DFA60A729CBC76D1DBFA10D57C3084E2027C657735A9EEF88126A44D2BF10F6863B5310C43BB856E812CE1B97939129C3D3218448776568E73FE9BFC4587AC2953C093357DB013AD90A033E6A472D6383507F67F9D6273B60564D7196735F3882618B0783A9A3A3E281898D34C08AC0FA7AB489CA3FBE1A7FA3148884ADBE50E54CDA7ADED820FC27B68AEB11C80DC3DD6FB9D79942538EB590979F427BAD5DA7C7B035B907B99E86B6C31969F34E116E79EF1D5DCAD272A5E3488494BAADFE62BF366EDFFFEA0DE9CFE2F14850F1168BAFE7DC03E0346E1DD0538E361BBA9D6C3227789BE4FB354992D923C50B7B19123F907B66DB827D54F47ABB448700AE27EE906DA638E9EC205865C4924276EA8DD984CDBE073C5D05BB4A9A242ED555C1D9EFDC0627F2370E499F2C51764F98220B287649094EC45FE7A5B2766AE6E90E6E8695B3325FD7BB8AAFCF2E15D38D1D106121BBEBEE7B8EF492EFFD2D6430F5DCE5864D429326E37EA86B15463A5B9C88133ECEC158B0FFB67ED563C085821EA1210120E0DD441DB572A88D00CBD50E80980FE675E136133CA4E1370668126D2AEA98D36273F652FCFD67722B87E6AEB281B1D9BEADA4BED94145FC719A45277D8B8AC19A60E08457869F75D6BEEFFAD1CD8A2998B5F7AC049D3DB75AAEF2FFAA69AF8905EBEAB8B86E23FE0AB52017853388F4330EA6DA78DC90783E6EEF2FF86B0583BE802B30846773AF7BE59480BCB0D1526B0E631CF4B0CA5CB742E8A8B4C5999EE88E44BDA1FC6971BF7CB3206A867EF9CDEE83F3BEC5783E8877DD4CEA10A816F14D96AC5C8AD88A92334B27DD8B8A5243DFAEC9F0E2DBBBB04E1ED4568A70374E419FFB3519215C018094355F91B3E499C463C1621A9C158AAF31922C959F959EBF6E6D60351F616057C67E76B954261214897EC05A07C56CDF0CE65AA2FF04101380317F90005601C0E0C7A8561A582F6899FE65341F0CA79DF868C49BFC9B95B3B808DBF4B327F35C1263EC15C6EBA3926B142C7A7E929DBDC206971C273DDB28FA58653144EB98CCBD75A21B972F0FE3C76A1C2CA21D009E635C4D0FD3FCE14FAD4264C3D6D00E43028385FCB1E731971B9897E12552624D0C8EAC7E1ED8A16D9B65C12DFDC0480D9B2A6E4E5B53F79E6FC4E75066D75D03CAF6F699FA2669B2309879F2AD32F2611B98F9D268CA3D55235CC3A87DB93DDE8DFC6374B25EF75F0D1123B3CD3A12327860BC5B882152D367E19AA461F850866BE58488E57730BA9179BEA68F263736DA6BAF5B770D6E55BCB8A83CE905B6EBCECC74EA2B8D04BFCE4549C6C497709D2D936EE5BDE2EDCBAD7DBEF69DB131D7673459FC4D9D31BD603A7D36BA246F4F6E8F329177C1FFC4C323BD00A780F9CE5F058C9A062700A6A23CE5BBEAB679F5BEBAC10EB27664B38C10B807032D8D546DB160E11066D93A37753D114B60C6470FC15970E561E3CC48A0C0B8F60DAA375E162A65E574AF2B9D6B7C9622A757395D2C48FB371ACEF0334583EFC001B84AEC1FE2643840F9454B93598167F7391166A9476F1A17E02F830365DFCAF0D7B426DE5978440C338F58B1E05839A71CAF3E78B77AA65BA1FD46BF3457E619BDAE5D19E1DA801D33343A6DDF3727666BCFE397A4250F1C491B1A3521664C80186E4997FA51F90E690729B40A96DF2F5C50D0BC73900691BCC8B20FB14A45862DB9267AD7FF52320CEA5546D31461EBB732431DC5FC429672A5A5A21E0FEB56ED1B6287CB9BB0FA60FB5CF505686DD72F54081DEEB6CD2FD2009BD21A4B7485BA43356A38820E35453F38B3E0F1C89E5D2AC60A944709A0B3F1C337A176A2755BD8C629BF57C1803638758341D5D0DE54B9C18AB13E052E16C6268DF5451ECEA094AC2BD7DFD2D8B5E1D2AA971854E5753CCAE43F40CC8FBFB6AFA826FC515B83B879C7EF758422A3B018D221431D4F033F426CA8A2E017241B1877FA084DB473CA217FBB3D69C2A1B2CF3EE7E63854BA2FF4ACF4BFF828B8EC47D71506A39C5C6C724DC12CAFCF3C7AB4C095EBEC2ED04D53251A47368941F897B656E3B6989E2377BD75B1B2A1905D7A274176D1BAA2677158934FB9AA0F5D97A440128E2311B966E98B23D91E7E0299193D4DB743DD917A185A6132F7D5BF8D44FA8ED48DF7F7A0F90D1086371E6330B3B81D105368EA77807AB4E0689285238DE9E7ED4460CE00F81A880A3848E05E642E1F4531BEDB4FC2ED4A52AC394E4234F6E05611602EB1BE537134ED9F24D9F47BE500C1C73EF551DC2CF7E0BF8C725B17ECEAF0DAB8B3F15112D180CA0355A0DE7AABE35123544955473140C1A211D2225BB6C115A43120EA3F89306D3B3EAE706C695EDADB0380CFFA1EE27D48B594E05076CDA16F51A7FC183AD9A99DE67AE18A5FE0DB7C2AAAE2839302037BA71CD18F7675CAA14D8D6519874F2A333D7C7963FF633DA201FD58551AF7F7214D1C2BD612ABB7712AB62605629E8070A743D323EA4844C1EB7347B3693D155FC08CC274639CE68B726319D2FF4289C4926A2BC88C32EA11C95885BE99632A9261632B23429CB6240FDDF1972D7A999A480633034ED1A88F3B4C3E01A5C49950FAB6CFD52219E7AA78CBC8F0DCEBBCC25701FB1B2CE4C23C24D7C6BA48A37D08A87F99C2F3121ECA194BA105482C18CB30AE691E6F87B71C8A07143C475887880B19056755FE8B74010080D48C4A6ACC4270A903D4F08AC80E6A6340DDA4931751B4E95839DF30B16F028A201BA29BDDD21DA69E5889B625B8171C66540C9D7661582D59408A3839340B03EBF93CFFEAACB9A462CDA1285DB900088503AB969222CEB5E61366C352D2781CEFC9E3D00CDBBDD820F5FD9F5F25006D6BFDE5A16063F1302071A7E6F574E7F56C3EBDAA9E2BFED115B4CFA155A00B7CBA65777BFC546327D294EE9215852905394CB8A5CD7ECC9BC656C3B6DB01730497F662548E8776CDFD90AB002ADDB8D2767895FAA6DD571C7E7936ADA00CF6D1B4A2D49FE918DBB292C094517A8E11B1D9B821A9D9086EAEA72EEDF8F4152C26F80CEE9461EBCC33B0986897601D1A5B222A3B5A8F493D98630C0426D49C93130EB4D05D3D8CFB7ABE419B43D58E2A874780FCD256E6BF6CC8435D75F255AC798A389457725979C8EF289CE664402FC0FABA37A24E3B40BDD806B23CEF43797B4D58DC614BAE859A362D15A19B192283F4A3930730E70E6AC82A1BA316E1DA9586BF8AC1B94390D9AACFCB2063C5D161A8D8538051061E646B642B51E26C35F7E49B40CB608B88C64B6FF7C16A29A197C7D9453E7E7B3629BD8FE4C67703DED74BED46DCF23E3B6F28B2DF2FA82D4C5ADA18394E07A79E9B4ED5564F63EED83826B9B493770231CA56B988ED31621B45F6B9FD5D451C189CC5D5104F35DE4EA32FD6C623EC01344A949621851007941C92A981EE1798838F5B4CEB6578C560B05CAD78260545B2181A0AA1752768BEDA09D4C3FBDB3638DFCBFBCDE6187CFADD8EE621471E68ABC48A138EB2AFEFF5EF38350317589EB23B46D8034746E997EC77D7884DA9DD2027BCE1997AFEF32C6D4A2A1DE068F11D3B3835D28DB243CD4F2120BFDCBECF926E89C965E39B698DB2998A3443DC6E3723DCC653BD9F33E2CE09632FD05E1BD6A624ECF88C85B95C120C96C2058A39345498EB6726FD14808C48393F179EBC09F0000FA65778F7F1B70224725311EF19725A8BE50C489B7CAE26312CE24BE4600DA70A21016B65A8BFD4A6F0CD3EC73A409D48C2F697D5C42D6CA798B5EAAAB6727AD53959ABEC3562711E9661DA8B64410686761A161464BA141B2C21CA1A5BCC2D213633F2372D6B0E5F66A57720D624B3DC628938B1335E3FB10AAF889B1909E215F6CA836BC9653E924EB5556795738C38E399047FE24FB36FC2A13A79300BCF50FFA488806A54B4CCF780E2D008C688C6615041BDAAC153B06D2EDB999C07628BD7E1A418B261FB7B2CAB234F0F5682D9AF401C6120C1254C87C2E511D04A914C8BEF676B2258F8DE95B6252332E1BFC997674376F3BAA90EBCC528C6B81D992376E739D2225ED3AE78510F58BCC7E21D157ECB68B8540A818140D3DE1318504F85ED23177D9CB7459C6D8FAE0ADB4B626122C66B1D860A2EF753E0BDD9634E120590B2D4B0718E83B6F06171812F82C9DB2A4A0D981D70B347A545B87CD8DBD35AAB271D3B0723A4F237BA223395C3DCF2BCAA97282CE963312CAFB65F78C7E1151DE6101E7998DF4D58383973361F54ADD2CC8579996E66DCBAE5F00202B157C17894E1E7961691B543BC8E92BD7EC383D73218471E8A7D2B794021A5FF3A552BE689A79EBCCEE2A7DD4A9E7702A57D0408D6D8B4A92081B5A789948138D9602C5A8324B013C772CD381596635C512AC7A4EC19EBDBF48FB1F7F563410B0F52C6D716DD4020A076826246A819E830CB268DD745964D0B6036B8275E1F1344A27988D0BDD8EABED3645D5364C4B6B448AE60CCA0135FF08DB589058E0B71F99AA2DD0C5CAA82966E96FB98BBDCBE315C2799C03F94C9AB55558FD12581C292AEBD7473E28B5EC51F635B73AE6A556325F2650B59DEB44A25AAA61A33C5D94CBC1B82AB44F53BEE323D7A7A359DD8BE85B434F3A40F32AD344F7A60F0056E77DB4C5009704580358BA95435686C4926DB9699036767A957E545A49BD1AA3F7CDDE1639BA993613AF66794BAE3D07709FE6C4A7BD2D2CF978D060DEE9D8A4D48F5997A1EF5BEAF9220C8FEE5C846CDB354918A092E75AB8385BF088717DEA9881A37373074C0CB74D2D8097D219DB4EA2BE6FC6471D617F31AB92AAD18BFD48A46BF96064F434EDB418263C7EB1743D557AF78F4DF4EBEC858E0E0B06C5CED5C6A54D186E75B3BDD6EC7D564170D51002BEAE838F9F2B7D68784F3E10DC75C1D71092F0B221844F0A358104AE46AC75B24752F5141CD6782ACF121CD799A0804A316463985216BDA98B5BA3C7134AA25E5F46180A288DD3E52AD68E1EB7ABD666AB88EDACDEF3050B263A470CA7A805A3E120701E61ACE38CFB20410A7C414ACCB79D1FF72299B42F2B412AC058AD33F0743A063DC267E4317CCE6B65FD00BC06A16F23C143013CA1F09EA6D0D9BE4989E7F1421A732876B6978F119CCD7B51F7261D414964933EE23EFEC7EDB0AE7D03B513FA89291E499B49158DE5E29357EC92B55EAE2E3EF634B0919D2CEB7CD6430994ACAE132032372D987CB052D4F7A13B8D51B97B2345D9EEB8E74420EA506508C3D6815AD3EB480F589AE9449F5D2400FC39F56809951041D0C4CA1C07D68CECE46E1727B39EEDF1B5EFD6E9F1C28A10C708DED3ED63D635B0DAC75C705363FD52636D0D33DCC2606C358F11BE175D34A1A41A08E964956C48DF27DA2C3F51EEE7787CD8FA10DA26FD87B206D90486722FDB053C3E2C0F08FD90BB6CA63704BAC4615DB9314A624F5D5D16D0F2D7A7306D4C1DB969C39B2DABCD6DE41247625917BBB56D1BED6390310C20793314352CE3633EE7756F81DA1877C5D292DCD8F90F813934596377301592DC46A6F012B978A9687FACD9A255816DDE941D8FFA5FCEB63C0BC6F676BDA609779FD65DBD78F2A6AC763D846C3B63B7F40FE7FEA09703D3676527E062DE4FD692CD9CDA8901462A3C6DC315447A89099E121B97332E35594FD13E6062D93E34A0626E8957502C61ED8A78AC87978A94DB6A87024DF4A662564F1EC441653EC706541F32E5A9E502188981C51A3544FD2B6C0D9383C2DA3E9EBDC45D4739B22EFE1125BEDED6159C4BD37866EB06463D57C2119DEAA281CDE3725218D133CDF7817FE32408554CC5F48126215A4A3EAB3C58FE8E2888E73C70D0C4E8881C9DA95F06E30C37B64E10BD7E4F4BF8BFA7700E5AF03D4B8B0151971AD461DBE22D1290B3B05EC1A48FD244D1CA4E510B8E8E8A7E93C1DCCD2612779C8FE13BB28303FF6370D9DD8479EAE88649A90CD242F531D85DEB07DD627D1F8A8FE42FB2FD95716CC884641624EDB8B7284C7747E0B58657393917F898974C487C397B9F10A0B7895C7AE3A02CFA76C9368EC2BE9C0943F1A653D7305EF004916C7F69F4AF4EF948C77BC885550E8B4AC20D2947BA9E7018F643B655891DFAC68A81047F3C542F8C70A59A1127A1613DB7438E03F31255A92577EEE9A23DA045BC96421C1785BF604D2B4AA1251A8EEDBFCA1558DAD9C4803CCA63E2E4D88DC59A96F41B6D3D2E6B15FCE35731565027CA0F738FAD0AEE7035F44D5FF68DEB92D9DAD8BFAC611CD5B86A301EC5B717550DFCC6DA590945CD5B23A45F4BCF4CD5461BD8CD17601AAE2F14E3DB5E366D86295DB75A9B07A580F41BB017CA440269C34A07207145B51AECB8A4B557A40199F9BC355F913CD59809622D517CD6797818F3D603D1B1EBF2BCBBB1D3C117242FDB77237FBA06E719BFA63C2FEFF537DA469B282893CF0A37A1614B32B455282BEE47A10151C5DA32DBABCFBB1888C5A181389F2FC367DB215C7EE7AFC0DCE36A210CB008E726F962ABE80CC01C3D157EB9F045FE3EEFAED7297C797796394F536D52DE4BEEE55167B88737CAC6656570D442C4B0D9244CD869D65035B55D0B70EF5483A8D51C4C9E21B1AE5BEEF838436AF9DBD23799E9AD3D8E21D801B4AF4A1A0556A2800FD7B31940D745D5E0F13B888F4C1E707D9305A08EE2CBDAE862FE7BC3043737C718049B701A94517D37AFECAED3DCBD0D4692B1D6CF6B3B9A5322A5F39293540E7C61A627191368EE0AD5B74612CDF83EDF2E763181082937D8100672B3FF5947EB4E59217A941FD637E63F9FB7FF4D5D63CDA3B55D9D504991C4635C12EEEECEA8BB7FCE5C1A13E07DFF6D2DE0D4B8FFCF3E982C26F180F88725CCFAE0576F3C934F6E75DF9846B69EA62A947121F6AB1D066FF551C49CA7F8BBCF1AC17F7376926A9BCD12D817E7CD14859771F4E3F7E8E5A16041F68D84173FE04A5EAF490584F5E0DBB62FE1D679FCF6A6BAF3B4923A13043EAAB5EC8ED599782C4C3B9C128370B124582A609FD85093EF88247E213575BDC4707E7773FFE0410821FE06CD8CA533084CB09EC1752D7223E7505085C7A55BF1A27E4D0000B15AC6D264FC72B45D25FD3CB24FE75EB945FBB69970AC6731DB8841D16E844F4F8FCF1D7ADAB02F89603B32899ED83979B5B72BA763B22C26D7B5390732EE3EAF15B3AC23E62F573521AF8010AB45BD9F1F2B289F4BD0367176A7B7CF79CC0274AED59D1B46D32343555DD5E5CB9770633703F38A83379210D4FF663C8CEA99F9674567C4AC14F371E4CB8F19A57A1770D848751C1AD9A609E5119657317416DE54C1835FCD29830F49AD6F719FB772F6252B13912AB4579B35A3812F7BCC1B7C54708281A89F30DF491209256B03E0DB62BFE281E982ABD2224BF3C62810FDEF059FCD65483693FEB0D8845A29765728A59BE0083C576E68DFBB2D947C9987E1ECCB937229A790C862EB60A375A8F7B760FD592CB51C1996F93B1DD592A3E80BEC28ED6E0E0B20575177C18177D506CC80F9489E41A24815995F60E83695B93C64F0B831B72F7D2F798F4561C27C912316A7952CCCC3698D6E41C0B98A5318FB01EAC97F3080721B4168F5D5DABE13B3C7E14A914694353964545417EAF20272FF0A6AF87372E38F7E22222013938F566E4FD637F5D10D2303314014ACE33EF1B9C26CBEFA6931B90F7E735F21778C80C9A9A6515C2576BA220167B43023B1B7689125D80CCA51771C7A2FAD2266F091AC82B65441823065536C3B5879F08FAD8FAC3C6CBBCD43E244A22F9B5C3CD8FA4AF079A743189C12BCE489A64391F6CB6A556AB9B44D51FE72C11C936CA288C6AAB268B8DE45680A0989553C542413DE958B3DBED41E668A4A85FBF81A5C03CF05C8CCDAC7096C18F45E97EB293CEF30C9E0D673BC40614D24EB17E9BAA2758BB2EE29CE430E74EED071C6F73004817B4B0EAA20E1DCB64C846BBCDFD118DAB21F8202558678A00B80895CF91111100B35720C8385FC28791D764D77CEF71AB2C43F8268116F120881C17010A55AA3814600E7C4B84FCE4952B2E80FFDE1794D18B9209311841A4D4EA4B8C6643CFC98F75F7D03C370AF4A07FAF44C7C25BEABB484C0E42321251D61DB06838AC3FF1C9784B836AF78F9E2B352BE7AD1D0D54FCC73E154148FEE964AD9F57B10F89ACB9607B678C9B1F189F92E0D3B4C3E44487D760F7AFF49266A71D3E493271F9AE1A68935458EE611D765A977D05D415649187439829557526304F853694B9F0A299FFCFD6A1B74F2D6A99BBAA0B8F9C1C3D3125ACC63D790108E7BA24239F9C4B362507DB1DFD74BDB6ED00DD9D01D335F1AB34193851A3BCE7FE803C5483646897F8270049665685E2EC70DDB353FE1866462DFC373C8D23D0A1024008E5022356D492E1DA21E3C0ABEB9652CB63916C3219EF2B5AF7F2398F277A5F7A53F8857073BA635C19E90D0F000C3D84E2E6033D6A50561BDD493116FED165A35CA58BD7B1E40CF0660F0D351BA37DDD960780288006F25C64F688FF6C513BD2BA9105EA9FDE3CFA94243BCBB4CE8D54DE2F021D2DFE5C84016A70A980028CDDC67E2A455A8BBCE20A2B1B540FBC05FF3C989798631E7FC2056540D4C8F068BC527ED89723002AFF997AAD7B75F37C00AF45CF39D1FB5ECA8AACB13B290C0F9A587FCB39FF556244AD03E778D9076C97E439DB2C6B7607C2865FD8165C592CA5CBF6A1273B7D732987FF09D0EB1D428404C601A7774016F3AF844664563E781AD3C179507C9B3DCB535E9BA4C14B807D0DC52D0F8DCF609E89932F588F14275C2C47BEF4BB69FE0409850D1CC681E4968CDAED75DB80B0CE58E1B111F687B5B5A4731F873605D37535A48700F2668B61A4AEBA20783D1DBD14D88D7B0F27F9DE6D030135F1E50EF428F24D3374AFCF3371BE01A1039C2412D37E58A52EBD0DBC78848A17D144ED7DA7C8848C535C4335A2EF5574727E17A344332700EAC71DD64C8518DAD3F959B1174219C5EB04ABA05E0A1604AFFD2ACCA0135680BE86D07A4236E09F4897B6B93E953B3790A345FEE8D66EE49D483BE48FE4B2D3E2D99B0516417338EBE25427ACDB2A92F0F01FB54C156CF7163BB4966658C5CD6DA580D54FD4E7D40A8B498CCB2D1FCB3EF71402CF9C2679F77B10DF07C7A996CD3D2F9E4905D1C541883EBDC38C102CBC7371032087114CC9DBB73E5A59E6EC7FCEF92F5CD05F846DE503709123085C7D853573465AE258044320F52C97738C7812BF73A701DD6CF8814695FF187A674D26DB12F990C7A56D6CFB38BA475EB20E9BDEFFD44054BF13DFDF7816141C89E897C7340FB9675E3D6721D8472BB62DF3E206AF59E6B64F8F4C9B3AED72424D86D6FE808C4065AA79D00E1716E85D5205B64EED36610D61F66F76BBC1A9111968194196459C7A3769018EE34EF5DC03EB0BC9257ECE005993DB5010036CAD711C6C9C09E9465A3A1ACFA9A85E08878FD838A820BAC280FBAB50826CB69F735D0565762E0C6FFD154358105B1C1DDA0A1E4303811E4E3FF5A235B49836720E5E8323E0DF783058135CA9599C4511FB1E965782EA23159E72F6FF333923B51946417DE28C1D7B044F18707178E6C0A3151329C9A9A7AB8E4735D61294C08A859EF72F9AEEF2E6B98097E72A890AAA21281329F8D4F1208219A6C3584B6A0F86361AC6AC0C77D4092D104E0CF7053DC41298F2501AB3ABEB20F77850D4F9A5F685613E43F191B07FB10C03DFDC0D7582D8B57B1BF773D2CD8F3B3AFCA7CBBB7AD359C9B2D74D8E7883E1D9888A82EC10E24FE29E25ED7E51650DE7523729059200ED10D49C98102E1D5CC5C22D20C12C4A2D827D684D6A7EB90A37843D8E06DBA90B328108130CF1824A083F770B9F5C3B8A1A60F51382B56A6BD836AAC0467E9CF2D3567E86BCAF917E98C016F01A14CDDA3315D9B50CA02A25FDB361DB34E0F47F187CA9CE0D4F96409F431DAC363FE330E4B5F936113E6CCBAA9150661840ED6FACF11FDDA8C5C4A7E07724D40EE267E53428638C952B7FC777AA13B79DF695BBF491496B543E989934A7350C25594473A4D694008D024BA9788D0CF5C6D590BE5DEE99FFFE6FB7B1950D502BB99176FEF1A5585AA94CA228251AE1EC0DD6A561E26708272F19A97C412F8744B4F2D5C9BE742FA310374A4C6C501D35920920EA9D25F568AFD1C8975BCD80219B4C3014E936C74D5562A37899084D5095867F86FB5AAD9153D0D61CC0EBD35FE1C1CB48FAED442126677E914D0B916972293CDD034472EFBFE29F6096F0CA844DAE27F974B49A38DDA4F60D938160736017AB05975E9E34C367A142CC6F8FAB6E1FD6C35D412501806460BA34ECB98780BB9EBC5E95DF9B7ED3A80C80A7967D2AEA13929D332907FE2DE21F1EDF1EECE3249380F98D5753849EC9C8B55B4944C73D0BF7934D9B709EAB5007384C3B5759D6C16169FE4BCB0D1D99AB0BB7C31D90B1B08A767A5704608F254E131197CA3441EA53B09082B6CF62515A5DC2EDC44D0528488351F371AE159A1469DC8F11959D98AC9DCFA09C94B110B5EED08CA4BB133E79EAA62F51061DFB7C0F201060D6179F1484AE298299B8326E899F93D2A014588422020B2ADEA0DD1FEF37FEB311707555C8AE0778D9520267CB6B65A0D63C96639B0A0EE2692CF82D8175774B779BB1ABC0BCFDEC88AC7DB21F7B0AE7F536ECC36D0CA5A6BA31A22970D23FFBF4088D13BB5C700B1652E89366F4765F1AB6CF546CEEE20B900D840D0699DEDA8729DE06F4B753BFD3BD151938F3AFC5CE7CBA52B5DD802756C2468545821B946E70879D73B504395C0CA92C727F7F129CE984F6A24BAB246B606042E68E9681E63E9C07B614F86DBA76D6870D3E6DFD6EA14C81E5020BF5AF5629A5B8486579C603409B37E177004D48522D6209E183002A9A90330DEEDE7FBA5222A5C96845CE435F7770290FC62F639753FC109DDAC53D1728686507C1B55B6C397D2F82D8DC6A7DCFA0EBAD3EA1A2BA8EFF1404698467FFC37F0AD07F4FC56160EE298C31C80FB782A50C7DDB083AA807947855DBF4992F2B76FE4CB1AF04FCBF062DFB4293FA7D6AC19B1A3B8124788982CABD885DCE6215F5C3C74B706509C36A239FB42970CA7F1F7F1DA5DBF532DF36D81EDFA7CE3BAF1B8BEDD7F35065D7F303CCC7CAA80D3EFF30876D56C1B3E62188CF95EB3FAE0B1A39B2B68A9AE602E211B3414134649CF98F10FA777FB6B3B6E03814DF383E2742D3B5CEB00E70A1962710989E09D85549BE7CBFC1521FD2C559D6A10620BFF3D238B5C67BC6527EC7510C6FCEB39CD9D080C80C6968C81416BA630E035A55C5615C53A64EF04A9EEFA745044CADAEE9DF42956573F73303DF567128FBB3B405008053571E8963A067BF59F896B77F4D7DB4317FFB5997E04CEB0E07793EA06AE306F74317DC9D09EF2C47F25FD8618D3036B81E5C9F12D5E3E5F6278C163180A4CF40F559CB48A3260348EE0CE0DD5FE1A81F6CE3599665493466C0B19251659C186F1F2630C314D6EA2075612D09E820BAE06E027EB7AB361AC987E3CDCCA01365621FEE66F24BDB84F295CD7381CF15CAA767C37F722F44B8CB5BB879AC538130D1E7930636B176B395010726DA4D192BFB86F6FB0DCC2B384BC6B601682F2AB435D0DF35E8D14DA20B0979B822235E7BB2E9479FCCFD338A443F5DD52E4A317A954A76BB080482801F93182E6890E226392BD8A8872260681AA4FA1AD64DDB5977586F0570B51C052732CA743B4E3FC10DF04D5F99B4FEB21964AE907CAA914243EC817ECBF2606389ADD6E4B89D3AA42BE4FDD97E54CF88A2C940995397E49F2167A8D229232D8E40AAC99D6B2CFD898E09A245E8CFAB837CDC48196B40F746DB4E3609A10D1E3BAB1D505DBFFF81DFC1343600F6AC67C47CFB86644F4E942C540F6605A2A8533B592BE658B03B0E77B71B7CA47C615B1B8991C43DB2FBBF5868F53CE0C15DDEDA9E4A387F179C8FF71025465A7F56D88CD742439A83724F5111CD5332DB50BF9C014EE0C46351B13411E141C1D87B8428F2211B91741BE5287CFFFB17045CC73DBD1ED7ABC5B89053A6360B8860468D38685D98ADC3FCB5DBF79EC54D79F082A7C5A0F14599CA2A8A6CE7C60F3683514F7B5C7947500E51A54BAD3FC94CB591040121DED134FA77E01C32CDDE54EFDCFE189E481C96AED427485B869C381819BE6CC48D29D91163BC10D679DBC7F8FEFB12FB2187FC26B4F2E0AD995FFC29DA395E3532CB30D7E474F2CE3BFEC83B23CB784FCE7EEC427E90BAFB231037E7FFBE0569154A19175A37AC0DA60720E9D19C249B6E6BF4CA44C1B7453D09ED37E73A6BB69B4EFAD6BAEB938531470FFE7ACF07DA382BDF797D773CF23D6C40E5A4AA5F778DADBF674177419879285AF618C130025819B672E10DC6FF16638782DD80DFC00E4A1684FE3DA79C08C4DD0A267B1525414EEE6CDB64816DB56F080799993E5C8E02DDEB8AAE9A1274E457C6129C44B6641FD6D7C6617C6DECC279C02444D0ADDEC856454674F47FE3218535A674FCFBCE801DC5C94CBC8971CDD2375CA39278A5009B3965F60F22F0ADB244774B067088087BEDCC062CE62DAC57B6DA19EBC928DE33CB75D81117CABF26589D0E47E0AB42BEC26F5ED3F449879F9F4077FD67F5547106A8D4C03198A2A5EE53B5DB056AB9C9F1E2A9D5E649CFE9CBEE585188DB4E8BAE2C492B313273FECED665ABEC061C77A52297D353C718B4B104CC845AA24828E3EC939B80A5C1B14AA1B51441641C79C3427CC9D75285E36BBFD4CC7B028AB7726DF7583B7EC1969F3F961164331BC718760DACDCF5A7123DB3C2462AC611B773E60F3D9131826589B72A18F3E9A19BA7DEBA5D06BBCD4EDFB6BE918479ED6497CE84E2309E13886FC02A966F0293B8379B47A4BF01F11EDF76BE8161925550CD2F4F53C4A4A67A8D4F76DBA13C3F1A27E91DB392666FF93D3AE88AC5FE6786228BCAAE200EA1FD329297449A1C768F9D28D36BB1C79DA60DD696A3ACB65A83820C96BC61612A7CB1D85739BBB33486DB56D20FBA4A16C42AEDAAB01400AEB78EC92C148121B5ED813B12FF5997C6833259C5B1481402972DA98A3D91419BA7BC9CB2DB3FF10FBA266B9C836C7C8E215E30EBEC76D33D6715E1F79E1DCF8A5F49352934556D134EF7F4875FF19A2F01AD90735660E9D703CCD3DF9C263EEDC712390C10DA73E492C95282ADABC3992EBC112C33013F3CB25690ECBA1685D64E84B28348340FFCB1E20DBFFB671467EFE8D98BE3C3E2B97A063BCA499ABBC3AACDE57B8BCEB08F0027718A98A21F3A07EF99B41A698E723384B6AD54967754D587E3DAD55434C68C93E85C5D0E2A0D239C1B2D7E72EEB138E44E8D629D87C0BF67889331164FEB513BAA3DC2904955B4E0FE365482BE932F3540B3BDBB1DA3F50306B611DDAFBED08890999D945D179267490881F3AF3D0EF6699B62C4465B207A141DD9FBEC633066FBA60771BCD432356F2451D0ACEBCF2445E5BB3989EC54EA26A45AB692C9B646533EA3E9ED2989E268A8BAC53823A1A565A5CC1E996F20C1B27B2DCAB0A79B31CF9EC969A8DA2861C81FB20365CA3FF80E9CC7449CC36D6FDC197B6A227F4F8061AEB270624C61ED87AF17F64DFC4F54885F68203B373C10BDBC3C85FE42397B8DEC63B0C1B991B8BBEB5560B1583A6BC3DC07212A974E4C669B28A0B753889D25F5AE4A5664DE93F7DAB5C641C3621695CD47CD9B68438DCCE1ADA11BCB4695C1D50D3D7A2808D16991BFF51CF478C7A9A20E27CC4350FD2AC56DC6EAD6A60DD58417F5816D15BFDC8B4E7CD25F072C0D13CA5B968EA671582A766BB7D1E1E465BF6D9176D0E9224A6C94426663B409749B0B0BD8C1F1DFDE4BE4825810B6D2FF41384D9BE98DC7E8862E9BC2D53FA0FDEE99DEA4A25D52F2FA1D26B96571153373A9F0F900C9F185456B94EE8391572EC0D618DEA0B734E970BEDF11DB2EDE57A92E4D97B4B4DC020117527934DAF20852380C5059D8F044FAE4B445F7688FE2AE44E027364E28EC62AE6B6DF3938942B5ACA94923954FC44CA63B930703B95B61EFCA38AA521905EB954083B7DC328851F30FF734AA364EB7F4DB3A3653BD1FD5305ED041C4B94C3366D53BCD4C613250EBD99384E7E7DF2CAD649B7095A5DE27F34FF6A4F0917BEEAD403FA5F1BE8A651F562E5022D3D5100012F8F1FCAACD88224DE33661B0BBBB0A5AB19FCDFA111152C869944EEC0A8678402570E7D65CC20CA71572B9B57F88E4BCEFED603BE237E185313EA5E114F39380234E0CF0E4C49B3A81D59F31117233FFA92D45051BC04C92FA3CE23E2D37B4804BE2BA001748BFCFDD1E943F27648CE81252231433D705172B8B22AACF6BD3BEA3256585CC84289C79A1CF7AF2FE03A97AA39547F757771D6CC0388ACFE03D7E9590786335BCD0FEC1890D5712A3A62E33D887DBF23C80D47B0014FC9487D39A3324CFA92CA212BC29E9393E6FD5E6933BA2A6DB7934741BCF0F506DBC2B7F2194E386378137E0CCD8B3124B29BF47EBF89220787D778D6C2DC232B5A4C39CE9DC5743A1D80ECE67911BC6886C3F756BF7F4A59A27A3593D10D06F60AD71C8D69A69FF1CC1F17860F92877C5E0C75B9227FA13CCC86A9862B7D0BB849E0FB566E2430ACC639B8D5DD932D367A54E0101ED890C6AFB120419B8A04A4F1DE11C4030A398CF1A818F5433C8CCA0A67D52B1CFDC0B9E3643DD3D9E62147675345EDF1B9151CFDB52FD558AD99E4C3102BDDCFDB3B2FDDC7211F7827AAB7427DA19DFE86718F235D0280D3FF41AADD63F8E2628550293483E9835150ABEF10C6C98FA6EBBACEBA31BFA24A9DEF6B65F03CF1D462941DAB2F71FE09BC70C1566088C94DEBFEEE37483E76F3F5490A2CE86AA4C2D72ACA1CF7CDC2345309F1BDAB668E18DF7CA2FDCFB70E3476C086C48FB81B853894E2D238BA34540DCA2754BCF613B32B66AE60B715662648FF265341E10317A1423B7D195807476370D0527FF15CA1A255AB117357A8F6B18A502A27D154E1C84D0126026BD15F236A87C8F024DBFEC09DE837696A38FB55347AE877F46FF6F157EC6FC8D1846B7F55B1FB23DF3C97E42F48E63ABF64A992B4F77EC9DCCA1A329D84316155102E7F2F874AD369B64B3221A0BC852ABB69E1898D7364EABDFFBC94617448E257AD83112F87521857E2872E9895F2DEF3C5402DEB8F7F5450FADAFD47342907EC9642CC670FB1282BE2E1B31156F843F68BB77C29430708E91BF3988F9F4B9CE27F707828A67C2EDBF3B395500CCF71F31299C54601858C442EBD59185439C18F7EFDB83252BFBE193D65BEE7D150501832CF3E20AFAE4E936EBF635057670CE9FE5601A50BF518457DB36125ECF3FB77588E509A8A7D7A6F438AFC9AA7D103E2F2AF575EED551B1739A57CBE5AF4FD286AA870AA50B4E7457C11B2FA39F6F18BFBCD99188D0D06117197578DD2B7BE13016165B4CD7FA26D72CD6BF1B9C48D2BAD48802F26FBBE8AEE0F9E25E5D3309E03F72BD07E40C5F5788D46E62F29A4013104265BC855AD7809A2C800350FB140935EF3059B1B2AD54DD5FDB92DA429BA8AEB1D9A806D67DC7B6ED187DDD2B3F1084422D75B2C02BC242EDF4ACE0D478FCADCEC64523AC277E88F3823E050915190FC48EF6FE0897BD087B6BB2757A16AE27BCEE562A3C3955B88F82117428C73DF31862E9EDD8C8183F22DBA5A74A904AF45EDAB4AC057B8A470E5D48E277FC433B8E28851B51276728D6B0F06BC6C9E32BF06EAFC45704D7395A1F70AE27F160C7C7626047D030F8CB252D8B848CEA0D22E765B85A9431CAB3FA41C2BF939B56AC8E48D04AACBB6A62E2303E09A05AA6791F8E723B4BA8B021397C9918127E65EDC2A4EEC6B7CC5679B1BB08414FC4F2E49C2AA0F82750D07E3440A633F36BB107737DE269064725B5563DD7E49FF26508B14F29B1695F9E918B893B5D4FA04602A1688CA6BEADEE3F6BE2C0EA512624AE585396C930CDCF9E1D24F961241A421E035AE0034D4711641536F80BA8D8DBD1846216E8CE8702B794BBE1681A01C3AC79ACECE24B82DE63D60D48FBE9455359D397F0A6FEA1762920C6B976A83D4062CC19545201CD0D5A2F58312C01CAB6633521395358FA1044B6B5874DC913DC9A1CE930CE9B5EB39A87BD0DA73F5D7B237472C50C0979FD8E349752E1093CB658CFFD84592F90E0DC2CB3B957D81D80AE4C31A4906FB8DCA58835FCE16F6B3E3B6307FE4EA88BDCC466508E40F0439A3D84D1879281D460C35FA38C44D8856F684E5CFA5BACD411BF50DDBCB0F92D6133BA190627426B61694F3CC296C752E8CF0A916A1DAA336AF6DBF20BE34745DE3405AE15B2AF7D05A13DB27AB0549E3765DB2002DBB2432CA69DDCF90901B42C563DD33FBDB85D483EDF2A98931FB51274258323F5EE623B7E98954BC9AD4198CF3EEA950B2F3670A518B6C14404D9BC608B22C51F20E71FF22A13B870F11BB5FF80A9A32DD497565FFDDECBC45785EE65A14239E02A9C85D2AC0C41005BC932E137DE905FFD841268FC6E9093F911E5802EC1DF5EC68AF9277D85F90BBFDD470561AFBCF11552B52CE1ED64D281F073ACD51564367FE624870CB51B45066E98C305EA7BC6F9814F6487C3EA0C6EBB2912023E14D0C0D6223AB57F724135FBF553E2086E512CCDF095A0981F73BDAC5B27E68528758B15E5DC7F0B9C87946C1849D9861DA175FFEB27BB9080E6BDDD0820BF7077FA44E737D446E00F9645F82AB87625312D9BA244C15C9951DED33836182C892A54458DD090652613A3E1F53EB718E27EA344AA5930A4219EA1746D69E3BBE936652CFB0B94F5336B887E401A16496EB2312E5616FAB9CACA5B409FC5F41828FE2ADF32D6EBF6BCE8ABC1A3057B8E3EFA886C97630102587EF316D740A9D55E7BE8ECD4890D7F1B66A421DA4004A42EBFB9B98BE0FE01D409F319CE066EE2521063D9AD0136906B2D3039418F2334D10A85E217EB07CB5F6CFAEE42F7D59E7896DB6476A9F250279F5F7AAAB0A92198D795172B0541BBCB6F6EC8CB7E70D130F43BB2596E7CC50A9CF06FAEFD08DB1D8443D0C9918C17F3A577063EAC3A628C48FFE6CE48E484056187B6B7275FE62AB168BC60AA8AAA39CB47DA5E8E489083B5C90CF63005093B7E4C822E4AAEB03D8BD477C02876FBBA9C5CDF8F0805AFC962F43F342EEF53D531E964C4E9AAF08A0917FC8E2D2E896345583A48B556D3586877F3B7241E5F28648744BE752A029E4868B3D0BE4149C0E9A9C59B469664813513F99B1FA552B271B5251F1F91FC53B5C5982586C41D8F201C8FB187ED60332797D2BBAF27003E09EFB2A3A6053094F29175E709D4B445E3D6A65F1DE85789D1DA9E84DA5548A678D37A9C48C85F9E2B1C652ABA789B9BA004D7AF8D59BC61CE996F48227DE35914D7A44348C2F33EE039FFD855BE89FC08298CD77B77A35BEFB81AFEBCEF5BFC136263AD34027F679AC2CB2973EADE129CD5151C082944D9B795C107773248751231574E34E48976F7DE2736D11571D7A6BBFC263DABF8F9C230B26602F7489A920E12149ADE320E48E2961E9925708DD638FEC9B3EED0102188F608136E266863AECD63792732B1921B635C322BC26E2B779239D9583BEA245F62314299791E162A54751FC319FEFC2D96CD514A9472B4BE5828ED1C054126A3119EF75AA3ED1AD3F7A43E9C0920F82D1AE7344C8F31989EA355330BF8DD6C494962FE48635C2A8E8B94BD6CF5EC260E24BC838090A1DDCF33CC6DCE23D6F4075FD9607A59ABEF12FDE27818E19D91347F3A07C825B64D9FE609E1D5E4CABF5CBF59EF536C9DFE23766688572ABB728308A81AF112EDE97D1BDDBA446CBB5F66D503250E9579CE0CCE7B8F81BBD3C4A517F20DA10B4CCD8767DBEE2D7329904EEEAA8B885B012BDEB288584C41ECC9643EC2DEB7BE58D99BA093862A3CA973275264C5FA7E9FCCE66E34A87C9687CD398256BE95001C8BF18748CD64094DFB89317CC1750098E84AACB23AEA6EF8FA882296EEFD6982DD86C37E5707356FE0E6264EBA15480D15245EBA707684A47124D8837BB998B04341183B126222D4BFD23BF8BF1154C74BD9AE9AC4F1A2F6349EDDDE331043F2D8E524AB7A31C72BC5358215274AD529134901FE1FE105981E5ECA8009106DADFB35F7B7283FB9D9B43053E7030B04E31AF4AC1AC3289FC38905F3667A2E088E0558B08FD0D35688308C8DBEBC604B1D91EF8FC30333E21EB32AD3C0B8F159D4999535F117A0C77E9A8E15111F40CA9BC36B87725C18DEB78672F022C9C7D1589BD1392B39210B899F9435DF28B354380C9716C4E78938C99DE079625E39416776556C957109E89C81BE8439C37B2A33032F89DC505C7451F6865896F61CEAD50E64B7493131CA63E2AA4D3AC4BA1A7DFAB900C8EB7AAFC8D192D35CAD83A8E0A00322A0496BC1AC609FC030286CD20BBF1B2B62E7A98A10BB49A7AF2B98825F2B2A30C4361010CFC342E99E905ACF9E23D51275AC5655CFF53372D386ACBE4D43001B6BB46729663D6ADF641B00BEB312A85F0EFDBF4C2C86967FBEA0518CCC9CE9C063312E183BEABFD35497346297F5CDD8E289EA2859D0FB1AB4E54F41C38F1BE95E8177FF8D9276C00AD3CFD6BBC587B1EDB59FEA80EB5F513CFC315459E953B7DFF7F0424C86D29A6108CE0836216E15BB8659FD6D84FE2B55F01A4966F7119379A29110BDE2BC880DD70DF26B4270944C0FFACD1A048FB4E4516AA8129E049A745B6B34619794606F7555DDA876B5BAD91457D4694FC3CEBC3AE24945A52346EDF39C4D3126C652B819F6E85973B3C77ACD1D0AF1C61124556601F16E6A989136843D5C914FCC6EE481EE33ED2D79F7C5625309DED0A6A6C615EA4DC2A01F6E2039BE88361913EB0DD1E2CFFFBE3BC4ED6DDA93D1AD89D82232B314B144C2014B6C689816AB1511445AC0F50EE7D445F3054E35A8120536E86E5E130E85772D98012B69861A5BF739077383F5B7AA6A1AC7563C2C47E7833837C3449B0B6E6FCC0BAB2CBADB6EE8673591FE7343DF1974B174A9839036F9568F5F99F7B86965AE4B81A2DF277BB0598D5CE459C0727A23A4271F0EB83A7D4F6C055CA85C3D1F78F4D692C3688F5B618F779A24C03C6869BD2D5B9611526B12E1CF202325DCF316EC225B48A3353AB0D3DE412C4C486C1E3816BAE2AC9BBEF4206C3C3F976B8E10AFC72ABB6EE6591F3EED911AFC4275C3789486D67E46E33145574AAC0FD789E16EF7D88D385950309A8387973F608B6D948ADEB51B46281AFABEA8B8301281C6B0AA3653F7374380AA6984D77231F0D34B43158BA581109858E4344EA36ED73D16DD01E1B4FFECE15ADF96AC0C67EA8A2FAE36E57979C0C6A32923A5DD067618817E5A160DA7D5BB3C039D7775E060181176B73895065B051727F32E86AFE951EAB4B4949DA5B2E417D8DF2B8084564AE2C236A6E1DE5664BB1112A0CC9F6AF10F553F31B7C034E142B1E8C185DBD11038B79340926F4BA8D19C8F06F4D03232660DC978B2332EB45C1D17C89B7AF821CFE5462F4E7231354C0B0D6D64BD58D1837A31C8CF720CBE563CA12FC58925CEE387B06BED84E0BB062CF1DB2C87A37AA8F48B9D930AE4F7593BA1AFAF7F12C9A395B75170CE54979E0E19C89704D501D11F93911A8BDFD54A0ECF81402A0419FDDDED13D509537A59E02AF373A26AD0D3A0E110D0DEEA1B86DFBB9B545FDA6459798277949F17AD3E2A6509A78C778853828ED7B31EA6A0BE20AB3034879AE6CC8305DEA9E8B67796089A33E3B19806DCFCF7B8ACB76513D4FD38F3F6AFF4DB07E2701F6E5624C91C32CCFD626A6BA31DC166EE6D755FE699373EC68B19AB6F285F12FAB4C4F1CE2F8C7A2DBAC4E4D723185A4F64E18DC9B2651C52B843B4D96DFE8CF822A95820EA5CA271E2D427B70FB599167B9D8CBBFB5BF1162B4610E916EDD792B31314C7A777E4E7089F29E506B9A22988929D272F289D1CFBEEDEEDFEC28FEB379A67F43EC0BBD3BAE4EE2F8399B8147FC58AAF42A80F760B5105871AD5B941393BB5E71EB5333B8A7A708263F0D9A6042C5975E8C94A9DEB587A5343DCFCBBE36F7DF70E14D1F04C5124CD40B7B20BB0ACAF008626EC65F8F473D61EA2B336B512343C52941A6F98DAC0A543697E6122D09D833D8E3C5F2D7690BF7587166759579D5F3B0C26EBF4608CC846BCEF2B7366ABE3C1BFE28610FA94949D4F5512175180AEE782045C9BEE2C168A5CE23BE2FBA0AA47156F21F77FD11C135141DB40BE87028CACC12FCA3BC19CF83D17DF6E14DF931ADE786AB70137BD60F9A12CECA9F009115D3D429084500B5B1A82B31FADA1648557BAFF81FA4AB322C554D4EC38422917D31AE5225BAAB5D0A8053587E1A2C4778BEEF9178248BFA3E6DAC8E4748D9EB9A448D8ACC4979C77B5FAC477150DD8835A6E7D882BCDA0BB10095E0F1747439354B5C17476F6F7156F85981BE703529A3AE55881A2E99831A4379FC3F1CAB5AB00DB3B340722C5128021EFFD76C9CA7480384AFE80E720F8B0B53B8A127791B39E195F8427E8576182F67F794AEA65FA16F61F86E3C493A45FCE18DF03F8286CF1487CD9C4D792A2EE4AE9BDBB834B943CA042212289F59221340C2D85AAD6C71FC0F66FF2B6C1B60957D8410007657F085C9E442342B8A25B9E7F608085FAA744C9B37B4799BBB5892A3CFA40AC8B63A89E0CDA120BE8D9DF40E1F074A3053D8448514DD4C71C58A8FAF66B2A576E3A3EDA77DB4271B3ABBCE7B8B4BE12EB58EE9FBE6F676DFFA640EE40D01551348A412DBE0506935345347B471794B549361953550C70CC5373E3249D6D6D7BD8758D80ABEA6DAD9662DA44B09BA1326057CB2099330320725A8BA690906546609C6998469E122797E35399EA2CC1936D467D30FC55E6E24DAC353AE2F461C928B1D7EBDE9B489BFF98EC3E13136693586448A554DED33F3E9BC9AE091534C634659A97E5ABDB8B49E9E23BBBFD75E577910350F33C7901C67FC19E6ADC30C02104C17234369D3EC5A4021BDBFE331E19C2C1B6E9F2DA334FF06EFBD9E382352FF0822814AAA437D75BAD4C9E83E50BCA3053DFDAD299D13B0383BD80448189E909F30D95B3D9783DE643C4D4829B40C52234915B36DEC34E369FCCFB9AE6F6DFD2B8FB846BF82F6CD624CEA7F0CBC95B10D8FA91B9E288F635D3AE874C2D664B167E9D06AED4D618DEFE7A3F9902BBFCA86992A1ED9BCC408085704F039026405C29EC9371578F09DEDAEE3ECE92A5ADEBEE2A895BA7989F0D2E075AE9765C81E21B7FBDC8300B6D50A934D313448ECFA0AD73470038E6C1EC0D80A7A15C21096A1BC1F08A6ACE3B7200C3E8F8846B28848ABC36E8C0D03CB2E3F791C4FFA311EAD9809F1BB3B4D0894E3F4E446EAD18659DFFE69FC7F0C7DE9CC5DCE2C7D41E4A7BBA529B325E8F5857130AD8717C4DFA86279E959B0916D4E66A70DD98FC23F5DF15CB7DD6B8B550B060BFB23E0822D33FBFCB10B35EFE07C104D8A2D5C19D5D55A036761C83C78E509A4758A567FDB0720FF17CDDCB07BB607D726701418C0C8E6753EA8407A03E4E1DFBE0FBCDA3E06DFF57F1308019CC73BE4225B17A245782A93E029A8552E88CAF83FF45FC15F62DBF001E444F37500416229815BE02A9D069FD91DAC3
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   915
         exponent:-352674
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   916
     ) < (LongFloat readFrom:'1q-500') 
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   917
     
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   918
     4.0 asLargeFloat < 4.5 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   919
     4.1 asLargeFloat < 4.2 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   920
     4.1 asLargeFloat < 4.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   921
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   922
     4.0 asLargeFloat < 8.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   923
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   924
     1.0 asLargeFloat < 2.0 asLargeFloat
23739
3a4a83bb825b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22299
diff changeset
   925
     1.0 asLargeFloat < 1.0 asLargeFloat
3a4a83bb825b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22299
diff changeset
   926
     1.0 asLargeFloat > 1.0 asLargeFloat
3a4a83bb825b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22299
diff changeset
   927
     1.0 asLargeFloat = 1.0 asLargeFloat
3a4a83bb825b #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 22299
diff changeset
   928
     2.0 asLargeFloat < 1.0 asLargeFloatfalse
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   929
     3.0 asLargeFloat < 1.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   930
     3.0 asLargeFloat < 2.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   931
     
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   932
     5.0 asLargeFloat < 500.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   933
     499.0 asLargeFloat < 500.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   934
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   935
     5.0 asLargeFloat < 7.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   936
     5.0 asLargeFloat < 17.0 asLargeFloat
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   937
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   938
    "
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   939
22049
0ab597f24699 #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 22042
diff changeset
   940
    "Modified (comment): / 17-07-2017 / 16:38:59 / cg"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   941
    "Modified: / 27-05-2019 / 16:39:49 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   942
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   943
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   944
productFromLargeFloat:aLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   945
    |otherMantissa otherExponent|
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   946
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   947
    otherMantissa := aLargeFloat mantissa.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   948
    otherExponent := aLargeFloat biasedExponent.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   949
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   950
    otherMantissa == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   951
        otherExponent ~= 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   952
            "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   953
            aLargeFloat isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   954
            self negative ifTrue:[^ aLargeFloat negated].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   955
            ^ aLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   956
        ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   957
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   958
    mantissa == 0 ifTrue:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   959
        biasedExponent = 0 ifTrue:[^ self].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   960
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   961
        self isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   962
        aLargeFloat negative ifTrue:[^ self negated].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   963
        ^ self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   964
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   965
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   966
    ^ self class
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   967
        mantissa:(mantissa * otherMantissa) 
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   968
        exponent:(biasedExponent + otherExponent)
7550
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
   969
        precision:(self precision min:aLargeFloat precision)
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   970
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   971
    "
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   972
     5.0 asLargeFloat * 4
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   973
     (5.0 asLargeFloat precision:20) * 4
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   974
    "
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   975
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
   976
    "Modified (comment): / 17-07-2017 / 14:50:42 / cg"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   977
    "Modified: / 27-05-2019 / 16:48:58 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   978
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   979
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   980
quotientFromLargeFloat:aLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   981
    "Return the quotient of the argument, aLargeFloat and the receiver.
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   982
     (i.e. divide aLargeFloat by self)
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   983
     Sent when aLargeFloat does not know how to divide by the receiver."
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   984
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   985
    |otherMantissa otherExponent otherPrecision q e pMin limit prec n|
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   986
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   987
    otherMantissa := aLargeFloat mantissa.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   988
    otherExponent := aLargeFloat biasedExponent.
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   989
    otherPrecision := aLargeFloat precision.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
   990
    
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   991
    otherMantissa == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   992
        otherExponent = 0 ifTrue:[^ aLargeFloat].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   993
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   994
        aLargeFloat isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   995
        self negative ifTrue:[^ aLargeFloat negated].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   996
        ^ aLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   997
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   998
    mantissa == 0 ifTrue:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
   999
        biasedExponent = 0 ifTrue:[^ self].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1000
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1001
        self isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1002
        aLargeFloat negative ifTrue:[^ self negated].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1003
        ^ self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1004
    ].
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1005
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1006
    pMin := (otherPrecision min:precision).
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1007
    pMin isFinite ifFalse:[
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1008
        pMin := DefaultPrecision.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1009
    ].    
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1010
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1011
    "/ (m1 * (2^e1))
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1012
    "/ -------------
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1013
    "/ (m2 * (2^e2))
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1014
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1015
    "/ (m1/m2) * (2^(e1-e2))
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1016
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1017
    e := (otherExponent - biasedExponent).
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1018
    q := (otherMantissa / mantissa).
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1019
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1020
    q isInteger ifFalse:[
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1021
        "/ now q must be made an integer with at least pMin bits
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1022
        q := (otherMantissa bitShift:pMin) / mantissa.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1023
        e := e - pMin.
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  1024
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1025
        q := q asInteger.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1026
        (n := q lowBit - 1) > 0 ifTrue:[
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1027
            e > 0 ifTrue:[
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1028
                q := q rightShift:n.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1029
                e := e - n.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1030
            ] ifFalse:[
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1031
                q := q rightShift:n.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1032
                e := e + n.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1033
            ].    
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  1034
        ].
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1035
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1036
"/        limit := pMin.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1037
"/        prec := 0.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1038
"/        [ q isInteger or:[ limit >= 0 ]] whileTrue:[
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1039
"/            q := q * 2. e := e - 1.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1040
"/            prec := prec + 1.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1041
"/            limit := limit - 1.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1042
"/        ].
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1043
"/        q isInteger ifFalse:[
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1044
"/            pMin := prec.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1045
"/            q := q asInteger.
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1046
"/        ].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1047
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1048
    ^ self class
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1049
        mantissa:q 
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  1050
        exponent:e
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1051
        precision:pMin
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  1052
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1053
    "Modified: / 10-10-2017 / 15:57:06 / cg"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1054
    "Modified: / 27-05-2019 / 16:40:09 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1055
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1056
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1057
sumFromLargeFloat:aLargeFloat
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1058
    |otherExponent otherMantissa e m|
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1059
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1060
    otherExponent := aLargeFloat biasedExponent.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1061
    otherMantissa := aLargeFloat mantissa.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1062
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1063
    otherMantissa == 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1064
        otherExponent = 0 ifTrue:[^ self].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1065
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1066
        aLargeFloat isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1067
        self isFinite ifTrue:[^ aLargeFloat].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1068
        aLargeFloat sign == self sign ifTrue:[^ aLargeFloat].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1069
        ^ NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1070
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1071
    mantissa == 0 ifTrue:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1072
        biasedExponent = 0 ifTrue:[^ aLargeFloat].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1073
        "/ INF or NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1074
        self isNaN ifTrue:[^ NaN].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1075
        ^ self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1076
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1077
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1078
    otherExponent = biasedExponent ifTrue:[
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1079
        m := otherMantissa + mantissa. 
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1080
        e := biasedExponent
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1081
    ] ifFalse:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1082
        otherExponent> biasedExponent ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1083
            m := (otherMantissa bitShift:(otherExponent-biasedExponent)) + mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1084
            e := biasedExponent
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1085
        ] ifFalse:[
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1086
            m := otherMantissa + (mantissa bitShift:(biasedExponent-otherExponent)).
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1087
            e := otherExponent
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1088
        ]
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1089
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1090
    ^ self class
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1091
        mantissa:m 
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1092
        exponent:e
7550
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
  1093
        precision:(self precision min:aLargeFloat precision)
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1094
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1095
    "Modified: / 27-05-2019 / 16:40:13 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1096
! !
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1097
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1098
!LargeFloat methodsFor:'initialization'!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1099
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1100
setPrecisionTo: n 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1101
        precision _ n.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1102
        self roundToPrecision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1103
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1104
    "Modified: / 28-05-2019 / 11:22:21 / Claus Gittinger"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1105
! !
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1106
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1107
!LargeFloat methodsFor:'mathematical functions'!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1108
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1109
agm: aNumber 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1110
	"Answer the arithmetic geometric mean of self and aNumber"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1111
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1112
	| a b am gm |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1113
	a _ self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1114
	b _ aNumber.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1115
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1116
	[am _ a + b timesTwoPower: -1.	"am is arithmetic mean"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1117
	gm _ (a * b) sqrt.	"gm is geometric mean"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1118
	a = am or: [b = gm]] 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1119
			whileFalse: 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1120
				[a _ am.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1121
				b _ gm].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1122
	^am
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1123
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1124
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1125
arCosh
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1126
	"Evaluate the area hyperbolic cosine of the receiver."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1127
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1128
	| arCosh x one y two |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1129
	x _ self asLargeFloatPrecision: 16 + precision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1130
	one _ x one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1131
	x < one ifTrue: [DomainError signal: 'cannot compute arCosh of a number less than 1'].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1132
	x = one ifTrue: [^self zero].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1133
	y _ x - one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1134
	y < one
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1135
		ifTrue:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1136
			[y exponent * -4 >= precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1137
				ifTrue: [arCosh _ (y powerExpansionArCoshp1Precision: y precision) * (y timesTwoPower: 1) sqrt]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1138
				ifFalse:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1139
					[two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1140
					arCosh _ ((y * (y + two)) sqrt + y + one) ln]]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1141
		ifFalse: [arCosh _ ((x squared - one) sqrt + x) ln].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1142
	^arCosh asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1143
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1144
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1145
arSinh
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1146
	"Evaluate the area hyperbolic sine of the receiver."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1147
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1148
	| arSinh x one |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1149
	self isZero ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1150
	self exponent negated > precision ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1151
	x _ self asLargeFloatPrecision: 16 + precision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1152
	x inPlaceAbs.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1153
	self exponent * -4 >= precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1154
		ifTrue: [arSinh _ x powerExpansionArSinhPrecision: x precision]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1155
		ifFalse:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1156
			[one _ x one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1157
			arSinh _ ((x squared + one) sqrt + x) ln].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1158
	self negative ifTrue: [arSinh inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1159
	^arSinh asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1160
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1161
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1162
arTanh
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1163
	"Evaluate the area hyperbolic tangent of the receiver."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1164
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1165
	| arTanh x one |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1166
	self isZero ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1167
	x _ self asLargeFloatPrecision: 16 + precision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1168
	x inPlaceAbs.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1169
	one _ x one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1170
	x >= one ifTrue: [DomainError signal: 'cannot evaluate arTanh of number of magnitude >= 1'].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1171
	self exponent * -4 >= precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1172
		ifTrue: [arTanh _ x powerExpansionArTanhPrecision: x precision]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1173
		ifFalse:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1174
			[arTanh _ ((one + x) / (one - x)) ln.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1175
			arTanh inPlaceTimesTwoPower: -1].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1176
	self negative ifTrue: [arTanh inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1177
	^arTanh asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1178
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1179
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1180
arcCos
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1181
        "Evaluate the arc cosine of the receiver."
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1182
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1183
        | arcCos x one |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1184
        self isZero ifTrue: [^(self pi timesTwoPower: -1)].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1185
        x := self asLargeFloatPrecision: 16 + precision.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1186
        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1187
        one := x one.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1188
        x > one ifTrue: [DomainError signal: 'cannot compute arcCos of a number greater than 1'].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1189
        arcCos := x = one
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1190
                ifTrue: [self zero]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1191
                ifFalse: [((one - x squared) sqrt / x) arcTan].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1192
        self negative ifTrue: [arcCos := x pi - arcCos].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1193
        ^arcCos asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1194
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1195
    "Modified (format): / 28-05-2019 / 16:15:15 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1196
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1197
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1198
arcSin
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1199
        "Evaluate the arc sine of the receiver."
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1200
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1201
        | arcSin x one |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1202
        self isZero ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1203
        x := self asLargeFloatPrecision: 16 + precision.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1204
        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1205
        one := x one.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1206
        x > one ifTrue: [DomainError signal: 'cannot compute arcSin of a number greater than 1'].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1207
        arcSin := x = one
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1208
                ifTrue: [self pi timesTwoPower: -1]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1209
                ifFalse: [self exponent * -4 >= precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1210
                        ifTrue: [x powerExpansionArcSinPrecision: x precision]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1211
                        ifFalse: [(x / (one - x squared) sqrt) arcTan]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1212
        self negative ifTrue: [arcSin inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1213
        ^arcSin asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1214
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1215
    "Modified (format): / 28-05-2019 / 16:15:21 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1216
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1218
arcTan
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1219
        "Evaluate the arc tangent of the receiver."
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1220
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1221
        | x arcTan one power |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1222
        self isZero ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1223
        self > 1
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1224
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1225
                        [x := self asLargeFloatPrecision: precision * 2 + 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1226
                        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1227
                        arcTan := (x pi timesTwoPower: -1) - x reciprocal arcTan]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1228
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1229
                        [power := ((precision bitShift: -1) + self exponent max: 4) highBit.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1230
                        x := self asLargeFloatPrecision: precision + (1 bitShift: 1 + power).
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1231
                        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1232
                        one := x one.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1233
                        power timesRepeat: [x := x / (one + (one + x squared) sqrt)].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1234
                        arcTan := x powerExpansionArcTanPrecision: x precision + 6.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1235
                        arcTan inPlaceTimesTwoPower: power].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1236
        self negative ifTrue: [arcTan inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1237
        ^arcTan asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1238
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1239
    "Modified (format): / 28-05-2019 / 16:15:28 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1240
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1241
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1242
arcTan: denominator
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1243
        "Evaluate the four quadrant arc tangent of the argument denominator (x) and the receiver (y)."
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1244
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1245
        self isZero
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1246
                ifTrue: [denominator sign positive
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1247
                        ifTrue: [ ^(self + denominator) zero ]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1248
                        ifFalse: [ self positive
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1249
                                ifTrue: [ ^(self + denominator) pi ]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1250
                                ifFalse: [ ^(self + denominator) pi negated ]]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1251
                ifFalse: [denominator isZero
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1252
                        ifTrue: [self positive
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1253
                                ifTrue: [ ^(self + denominator) pi timesTwoPower: -1 ]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1254
                                ifFalse: [ ^(self + denominator) pi negated timesTwoPower: -1 ]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1255
                        ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1256
                                [ | precision arcTan |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1257
                                precision := (self + denominator) precision.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1258
                                arcTan := ((self asLargeFloatPrecision: precision * 2) / (denominator asLargeFloatPrecision: precision * 2)) arcTan.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1259
                                (denominator > 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1260
                                        ifTrue: [ ^arcTan ]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1261
                                        ifFalse: [ self > 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1262
                                                ifTrue: [ ^arcTan + arcTan pi ]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1263
                                                ifFalse: [ ^arcTan - arcTan pi ]]) asLargeFloatPrecision: precision]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1264
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1265
    "Modified: / 28-05-2019 / 16:16:32 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1266
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1267
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1268
cos
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1269
        "Evaluate the cosine of the receiver"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1270
        
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1271
        | pi halfPi quarterPi x neg |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1272
        x := self moduloNegPiToPi.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1273
        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1274
        pi := self piDoublePrecision.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1275
        halfPi := pi timesTwoPower: -1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1276
        (neg := x > halfPi) ifTrue: [x inPlaceSubtract: pi; inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1277
        quarterPi := halfPi timesTwoPower: -1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1278
        x > quarterPi
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1279
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1280
                        [x inPlaceSubtract: halfPi; inPlaceNegated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1281
                        x := self sin: x]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1282
                ifFalse: [x := self cos: x].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1283
        neg ifTrue: [x inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1284
        ^x asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1285
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1286
    "Modified (format): / 28-05-2019 / 16:17:03 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1287
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1288
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1289
cosh
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1290
        | e x |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1291
        self isZero ifTrue: [^self one].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1292
        self exponent negated > precision ifTrue: [^self one].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1293
        x := self asLargeFloatPrecision: precision + 16.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1294
        self exponent * -4 >= precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1295
                ifTrue: [^(x powerExpansionCoshPrecision: x precision) asLargeFloatPrecision: precision].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1296
        e := x exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1297
        ^e
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1298
                inPlaceAdd: e reciprocal;
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1299
                inPlaceTimesTwoPower: -1;
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1300
                asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1301
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1302
    "Modified (format): / 28-05-2019 / 16:17:10 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1303
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1304
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1305
exp
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1306
	"Answer the exponential of the receiver."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1307
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1308
	| ln2 x q r ri res n maxIter p one two |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1309
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1310
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1311
	"Use following decomposition:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1312
		x exp = (2 ln * q + r) exp.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1313
		x exp = (2**q * r exp)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1314
	ln2 _ two ln.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1315
	x _ self / ln2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1316
	q _ x truncated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1317
	r _ (x - q) * ln2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1318
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1319
	"now compute r exp by power series expansion
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1320
	we compute (r/(2**p)) exp ** (2**p) in order to have faster convergence"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1321
	p _ 10 min: precision // 2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1322
	r _ r timesTwoPower: p negated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1323
	ri _ one asLargeFloatPrecision: precision + 16.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1324
	res _ ri copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1325
	n _ 0.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1326
	maxIter _ 1 + ((precision + 16) / p) ceiling.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1327
	[n <= maxIter] whileTrue: 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1328
			[n _ n + 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1329
			ri inPlaceMultiplyBy: r / n.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1330
			res inPlaceAdd: ri].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1331
	p timesRepeat: [res inPlaceMultiplyBy: res].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1332
	res inPlaceTimesTwoPower: q.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1333
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1334
	"now use a Newton iteration to refine the result
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1335
	res = res * (self - res ln + 1)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1336
	[| oldres delta |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1337
	oldres _ res.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1338
	res _ res asLargeFloatPrecision: res precision + 32.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1339
	res inPlaceMultiplyBy: self - res ln + 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1340
	delta _ (res - oldres) exponent.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1341
	delta = 0 or: [delta <= (res exponent - precision - 8)]] 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1342
			whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1343
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1344
	^res asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1345
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1346
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1347
ln
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1348
	"Answer the neperian logarithm of the receiver."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1349
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1350
	| x4 one two p res selfHighRes prec e |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1351
	self <= self zero ifTrue: [DomainError signal: 'ln is only defined for x > 0.0'].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1352
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1353
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1354
	self = one ifTrue: [^self zero].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1355
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1356
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1357
	"Use Salamin algorithm (approximation is good if x is big enough)
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1358
		x ln = Pi  / (2 * (1 agm: 4/x) ).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1359
	If x not big enough, compute (x timesTwoPower: p) ln - (2 ln * p)
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1360
	if x is close to 1, better use a power expansion"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1361
	prec _ precision + 16.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1362
	e _ self exponent.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1363
	e < 0 ifTrue: [e _ -1 - e].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1364
	e > prec
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1365
		ifTrue: [p _ 0]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1366
		ifFalse:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1367
			[p _ prec - e.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1368
			prec _ prec + p highBit].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1369
	selfHighRes _ self asLargeFloatPrecision: prec.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1370
	(selfHighRes - one) exponent * -4 >= precision ifTrue: [^(selfHighRes powerExpansionLnPrecision: prec) asLargeFloatPrecision: precision].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1371
	self < one ifTrue: [selfHighRes inPlaceReciprocal].	"Use ln(1/x) => - ln(x)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1372
	x4 _ (4 asLargeFloatPrecision: prec) 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1373
				inPlaceDivideBy: selfHighRes;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1374
				inPlaceTimesTwoPower: p negated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1375
	res _ selfHighRes pi / (one agm: x4) timesTwoPower: -1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1376
	res _ selfHighRes = two 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1377
		ifTrue: [res / (p + 1)]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1378
		ifFalse: [p = 0 ifTrue: [res] ifFalse: [res - ((two asLargeFloatPrecision: prec) ln * p)]].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1379
	self < one ifTrue: [res inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1380
	^res asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1381
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1382
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1383
sin
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1384
        "Evaluate the sine of the receiver"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1385
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1386
        | pi halfPi quarterPi x neg |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1387
        x := self moduloNegPiToPi.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1388
        neg := x negative.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1389
        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1390
        pi := self piDoublePrecision.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1391
        halfPi := pi timesTwoPower: -1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1392
        x > halfPi ifTrue: [x inPlaceSubtract: pi; inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1393
        quarterPi := halfPi timesTwoPower: -1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1394
        x > quarterPi
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1395
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1396
                        [x inPlaceSubtract: halfPi; inPlaceNegated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1397
                        x := self cos: x]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1398
                ifFalse: [x := self sin: x].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1399
        neg ifTrue: [x inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1400
        ^x asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1401
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1402
    "Modified (format): / 28-05-2019 / 16:18:20 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1403
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1404
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1405
sincos
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1406
	"Evaluate the sine and cosine of the receiver"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1407
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1408
	| pi halfPi quarterPi x sincos sinneg cosneg |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1409
	x _ self moduloNegPiToPi.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1410
	sinneg _ x negative.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1411
	x inPlaceAbs.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1412
	pi _ self piDoublePrecision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1413
	halfPi _ pi timesTwoPower: -1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1414
	(cosneg _ x > halfPi) ifTrue: [x inPlaceSubtract: pi; inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1415
	quarterPi _ halfPi timesTwoPower: -1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1416
	x > quarterPi
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1417
		ifTrue:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1418
			[x inPlaceSubtract: halfPi; inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1419
			sincos _ (self sincos: x) reversed]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1420
		ifFalse:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1421
			[sincos _ self sincos: x].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1422
	sinneg ifTrue: [sincos first inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1423
	cosneg ifTrue: [sincos last inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1424
	^sincos collect: [:e| e asLargeFloatPrecision: precision]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1425
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1426
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1427
sinh
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1428
        | e x |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1429
        self isZero ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1430
        self exponent negated > precision ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1431
        x := self asLargeFloatPrecision: precision + 16.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1432
        self exponent * -4 >= precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1433
                ifTrue: [^(x powerExpansionSinhPrecision: x precision) asLargeFloatPrecision: precision].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1434
        e := x exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1435
        ^e
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1436
                inPlaceSubtract: e reciprocal;
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1437
                inPlaceTimesTwoPower: -1;
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1438
                asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1439
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1440
    "Modified (format): / 28-05-2019 / 16:18:25 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1441
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1442
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1443
sqrt
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1444
        "Answer the square root of the receiver."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1445
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1446
        | decimalPlaces n norm guess previousGuess one stopIteration |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1447
        self negative 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1448
                ifTrue: 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1449
                        [^ DomainError signal: 'sqrt undefined for number less than zero.'].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1450
        self isZero ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1451
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1452
        "use additional bits"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1453
        decimalPlaces _ precision + 16.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1454
        n _ self asLargeFloatPrecision: decimalPlaces.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1455
        
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1456
        "constants"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1457
        one _ n one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1458
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1459
        "normalize n"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1460
        norm _ n exponent quo: 2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1461
        n _ n timesTwoPower: norm * -2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1462
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1463
        "Initial guess for sqrt(1/n)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1464
        previousGuess _ self class 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1465
                                mantissa: 3
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1466
                                exponent: -2 - (n exponent quo: 2)
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1467
                                precision: decimalPlaces.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1468
        guess _ previousGuess copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1469
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1470
        "use iterations x(k+1) _ x*( 1 +  (1-x*x*n)/2) to guess sqrt(1/n)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1471
        
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1472
        [guess inPlaceMultiplyNoRoundBy: guess.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1473
        guess inPlaceMultiplyBy: n.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1474
        guess inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1475
        guess inPlaceAddNoRound: one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1476
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1477
        "stop when no evolution of precision + 12 first bits"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1478
        stopIteration _ guess isZero or: [guess exponent < (decimalPlaces - 4) negated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1479
        guess inPlaceTimesTwoPower: -1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1480
        guess inPlaceAddNoRound: one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1481
        guess inPlaceMultiplyNoRoundBy: previousGuess.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1482
        guess negative ifTrue: [guess inPlaceNegated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1483
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1484
        guess isZero or: [stopIteration]] 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1485
                        whileFalse: 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1486
                                [guess roundToPrecision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1487
                                previousGuess inPlaceCopy: guess].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1488
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1489
        "multiply by n and un-normalize"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1490
        guess inPlaceMultiplyBy: n.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1491
        guess inPlaceTimesTwoPower: norm.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1492
        ^guess asLargeFloatPrecision: precision
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1493
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1494
    "Modified: / 28-05-2019 / 11:22:33 / Claus Gittinger"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1495
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1496
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1497
tan
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1498
        "Evaluate the tangent of the receiver"
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1499
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1500
        | pi halfPi quarterPi x sincos neg tan |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1501
        x := self moduloNegPiToPi.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1502
        neg := x negative.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1503
        x inPlaceAbs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1504
        pi := self piDoublePrecision.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1505
        halfPi := pi timesTwoPower: -1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1506
        (x > halfPi)
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1507
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1508
                        [x inPlaceSubtract: pi; inPlaceNegated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1509
                        neg := neg not].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1510
        x exponent * -4 >= precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1511
                ifTrue: [tan := x powerExpansionTanPrecision: x precision]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1512
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1513
                        [quarterPi := halfPi timesTwoPower: -1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1514
                        x > quarterPi
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1515
                                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1516
                                        [x inPlaceSubtract: halfPi; inPlaceNegated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1517
                                        sincos := (self sincos: x) reversed]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1518
                                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1519
                                        [sincos := self sincos: x].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1520
                        sincos first inPlaceDivideBy: sincos last.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1521
                        tan := sincos first].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1522
        neg ifTrue: [tan inPlaceNegated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1523
        ^tan asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1524
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1525
    "Modified (format): / 28-05-2019 / 16:18:37 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1526
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1527
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1528
tanh
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1529
        | e x ep one |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1530
        self isZero ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1531
        self exponent negated > precision ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1532
        x := self asLargeFloatPrecision: precision + 16.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1533
        self exponent * -4 >= precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1534
                ifTrue: [^(x powerExpansionTanhPrecision: x precision) asLargeFloatPrecision: precision].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1535
        e := x exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1536
        one :=x one.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1537
        e inPlaceMultiplyBy: e.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1538
        ep := e + one.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1539
        ^e
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1540
                inPlaceSubtract: one;
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1541
                inPlaceDivideBy: ep;
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1542
                asLargeFloatPrecision: precision
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1543
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1544
    "Modified (format): / 28-05-2019 / 16:18:42 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1545
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1546
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1547
!LargeFloat methodsFor:'printing'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1548
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1549
absPrintExactlyOn: aStream base: base
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1550
        "Print my value on a stream in the given base. 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1551
        Based upon the algorithm outlined in:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1552
        Robert G. Burger and R. Kent Dybvig
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1553
        Printing Floating Point Numbers Quickly and Accurately
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1554
        ACM SIGPLAN 1996 Conference on Programming Language Design and Implementation
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1555
        June 1996.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1556
        This version guarantees that the printed representation exactly represents my value
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1557
        by using exact integer arithmetic."
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1558
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1559
        | fBase significand exp baseExpEstimate r s mPlus mMinus scale roundingIncludesLimits d tc1 tc2 fixedFormat decPointCount shead slowbit |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1560
        fBase := base asFloat.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1561
        self normalize.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1562
        significand := mantissa abs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1563
        roundingIncludesLimits := significand even.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1564
        exp := biasedExponent.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1565
        baseExpEstimate := (self exponent * fBase reciprocalLogBase2 - 1.0e-10) ceiling.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1566
        exp >= 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1567
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1568
                        [significand isPowerOfTwo
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1569
                                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1570
                                        [r := significand bitShift: 2 + exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1571
                                        s := 4.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1572
                                        mPlus := 2 * (mMinus := 1 bitShift: exp)]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1573
                                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1574
                                        [r := significand bitShift: 1 + exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1575
                                        s := 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1576
                                        mPlus := mMinus := 1 bitShift: exp]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1577
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1578
                        [significand isPowerOfTwo
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1579
                                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1580
                                        [r := significand bitShift: 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1581
                                        s := 1 bitShift: 2 - exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1582
                                        mPlus := 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1583
                                        mMinus := 1]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1584
                                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1585
                                        [r := significand bitShift: 1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1586
                                        s := 1 bitShift: 1 - exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1587
                                        mPlus := mMinus := 1]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1588
        baseExpEstimate >= 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1589
                ifTrue: [s := s * (base raisedToInteger: baseExpEstimate)]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1590
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1591
                        [scale := base raisedToInteger: baseExpEstimate negated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1592
                        r := r * scale.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1593
                        mPlus := mPlus * scale.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1594
                        mMinus := mMinus * scale].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1595
        ((r + mPlus >= s) and: [roundingIncludesLimits or: [r + mPlus > s]])
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1596
                ifTrue: [baseExpEstimate := baseExpEstimate + 1]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1597
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1598
                        [r := r * base.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1599
                        mPlus := mPlus * base.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1600
                        mMinus := mMinus * base].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1601
        (fixedFormat := baseExpEstimate between: -3 and: 6)
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1602
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1603
                        [decPointCount := baseExpEstimate.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1604
                        baseExpEstimate <= 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1605
                                ifTrue: [aStream nextPutAll: ('0.000000' truncateTo: 2 - baseExpEstimate)]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1606
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1607
                        [decPointCount := 1]. 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1608
        slowbit := 1 - s lowBit .
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1609
        shead := s bitShift: slowbit.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1610
        [d := (r bitShift: slowbit) // shead.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1611
        r := r - (d * s).
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1612
        (tc1 := (r <= mMinus) and: [roundingIncludesLimits or: [r < mMinus]]) |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1613
        (tc2 := (r + mPlus >= s) and: [roundingIncludesLimits or: [r + mPlus > s]])] whileFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1614
                [aStream nextPut: (Character digitValue: d).
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1615
                r := r * base.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1616
                mPlus := mPlus * base.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1617
                mMinus := mMinus * base.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1618
                decPointCount := decPointCount - 1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1619
                decPointCount = 0 ifTrue: [aStream nextPut: $.]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1620
        tc2 ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1621
                [(tc1 not or: [r * 2 >= s]) ifTrue: [d := d + 1]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1622
        aStream nextPut: (Character digitValue: d).
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1623
        decPointCount > 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1624
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1625
                [decPointCount - 1 to: 1 by: -1 do: [:i | aStream nextPut: $0].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1626
                aStream nextPutAll: '.0'].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1627
        fixedFormat ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1628
                [aStream nextPut: $e.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1629
                aStream nextPutAll: (baseExpEstimate - 1) printString]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1630
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1631
    "Modified (comment): / 28-05-2019 / 16:15:05 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1632
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1633
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1634
asMinimalDecimalFraction
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1635
        "Answer the shortest decimal Fraction that will equal self when converted back asFloat.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1636
        A decimal Fraction has only powers of 2 and 5 as decnominator.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1637
        For example, 0.1 asMinimalDecimalFraction = (1/10)."
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1638
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1639
        | significand exp baseExpEstimate r s mPlus mMinus scale roundingIncludesLimits d tc1 tc2 fixedFormat decPointCount shead slowbit numerator denominator |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1640
        self isZero ifTrue: [^0].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1641
        self negative ifTrue: [^self negated asMinimalDecimalFraction negated].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1642
        self normalize.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1643
        significand := mantissa abs.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1644
        roundingIncludesLimits := significand even.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1645
        exp := biasedExponent.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1646
        baseExpEstimate := (self exponent * 10.0 reciprocalLogBase2 - 1.0e-10) ceiling.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1647
        numerator := 0.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1648
        denominator := 0.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1649
        exp >= 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1650
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1651
                        [significand isPowerOfTwo
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1652
                                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1653
                                        [r := significand bitShift: 2 + exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1654
                                        s := 4.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1655
                                        mPlus := 2 * (mMinus := 1 bitShift: exp)]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1656
                                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1657
                                        [r := significand bitShift: 1 + exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1658
                                        s := 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1659
                                        mPlus := mMinus := 1 bitShift: exp]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1660
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1661
                        [significand isPowerOfTwo
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1662
                                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1663
                                        [r := significand bitShift: 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1664
                                        s := 1 bitShift: 2 - exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1665
                                        mPlus := 2.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1666
                                        mMinus := 1]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1667
                                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1668
                                        [r := significand bitShift: 1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1669
                                        s := 1 bitShift: 1 - exp.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1670
                                        mPlus := mMinus := 1]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1671
        baseExpEstimate >= 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1672
                ifTrue: [s := s * (10 raisedToInteger: baseExpEstimate)]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1673
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1674
                        [scale := 10 raisedToInteger: baseExpEstimate negated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1675
                        r := r * scale.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1676
                        mPlus := mPlus * scale.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1677
                        mMinus := mMinus * scale].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1678
        ((r + mPlus >= s) and: [roundingIncludesLimits or: [r + mPlus > s]])
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1679
                ifTrue: [baseExpEstimate := baseExpEstimate + 1]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1680
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1681
                        [r := r * 10.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1682
                        mPlus := mPlus * 10.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1683
                        mMinus := mMinus * 10].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1684
        (fixedFormat := baseExpEstimate between: -3 and: 6)
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1685
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1686
                        [decPointCount := baseExpEstimate.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1687
                        baseExpEstimate <= 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1688
                                ifTrue: [denominator := 10 raisedTo: baseExpEstimate negated]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1689
                ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1690
                        [decPointCount := 1]. 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1691
        slowbit := 1 - s lowBit .
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1692
        shead := s bitShift: slowbit.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1693
        [d := (r bitShift: slowbit) // shead.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1694
        r := r - (d * s).
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1695
        (tc1 := (r <= mMinus) and: [roundingIncludesLimits or: [r < mMinus]]) |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1696
        (tc2 := (r + mPlus >= s) and: [roundingIncludesLimits or: [r + mPlus > s]])] whileFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1697
                [numerator := 10 * numerator + d.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1698
                denominator := 10 * denominator.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1699
                r := r * 10.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1700
                mPlus := mPlus * 10.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1701
                mMinus := mMinus * 10.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1702
                decPointCount := decPointCount - 1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1703
                decPointCount = 0 ifTrue: [denominator := 1]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1704
        tc2 ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1705
                [(tc1 not or: [r * 2 >= s]) ifTrue: [d := d + 1]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1706
        numerator := 10 * numerator + d.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1707
        denominator := 10 * denominator.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1708
        decPointCount > 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1709
                ifTrue:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1710
                        [numerator := (10 raisedTo: decPointCount - 1) * numerator].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1711
                        fixedFormat ifFalse:
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1712
                                [(baseExpEstimate - 1) > 0
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1713
                                        ifTrue: [numerator := (10 raisedTo: baseExpEstimate - 1) * numerator]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1714
                                        ifFalse: [denominator := (10 raisedTo: 1 - baseExpEstimate) * (denominator max: 1)]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1715
                        denominator < 2 ifTrue: [^numerator].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1716
        ^numerator / denominator
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1717
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1718
    "Modified (comment): / 28-05-2019 / 16:16:57 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1719
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1720
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1721
printOn:aStream
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1722
    biasedExponent == 0 ifTrue:[
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1723
        mantissa printOn:aStream.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1724
        aStream nextPutAll:'.0'.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1725
        ^ self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1726
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1727
    mantissa == 0 ifTrue:[
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1728
        "/ a zero mantissa is impossible - except for zero and a few others
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1729
        biasedExponent == 0 ifTrue:[ aStream nextPutAll:'0.0'. ^ self].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1730
        self == NaN ifTrue:[ aStream nextPutAll:'NAN'. ^ self ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1731
        self == NegativeInfinity ifTrue:[ aStream nextPutAll:'-INF'. ^ self].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1732
        self == PositiveInfinity ifTrue:[ aStream nextPutAll:'INF'. ^ self].
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  1733
7550
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
  1734
        self error:'invalid largeFloat' mayProceed:true.
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
  1735
        aStream nextPutAll:'Invalid'. ^ self.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1736
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1737
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1738
    biasedExponent >= 0 ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1739
        (mantissa bitShift:biasedExponent) printOn:aStream.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1740
        aStream nextPutAll:'.0'.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1741
        ^ self
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1742
    ].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1743
    ((mantissa / (1 bitShift:biasedExponent negated)) asFixedPoint:6) printOn:aStream.
7550
1c2970e4f2ea still not perfect
Claus Gittinger <cg@exept.de>
parents: 7547
diff changeset
  1744
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1745
    "Modified: / 28-05-2019 / 11:23:22 / Claus Gittinger"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1746
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1747
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1748
printOn: aStream base: base 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1749
	self negative ifTrue: [aStream nextPut: $-].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1750
	self absPrintExactlyOn: aStream base: base
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1751
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1752
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1753
storeOn: aStream
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1754
	aStream nextPut: $(; nextPutAll: self class name.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1755
	aStream space; nextPutAll: 'mantissa:'; space; print: mantissa.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1756
	aStream space; nextPutAll: 'exponent:'; space; print: biasedExponent.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1757
	aStream space; nextPutAll: 'precision:'; space; print: precision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1758
	aStream nextPut: $)
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1759
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1760
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1761
xxprintOn: aStream
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1762
        ^self printOn: aStream base: 10
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1763
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1764
    "Created: / 28-05-2019 / 11:23:17 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1765
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1766
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1767
!LargeFloat methodsFor:'private'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1768
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1769
cos: x
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1770
	"Evaluate the cosine of x by recursive cos(2x) formula and power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1771
	Note that it is better to use this method with x <= pi/4."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1772
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1773
	| one cos fraction power |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1774
	x isZero ifTrue: [^x one].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1775
	power _ ((precision bitShift: -1) + x exponent max: 0) highBit.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1776
	fraction _ x timesTwoPower: power negated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1777
	cos _ fraction powerExpansionCosPrecision: precision + (1 bitShift: 1 + power).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1778
	one _ x one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1779
	power timesRepeat:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1780
		["Evaluate cos(2x)=2 cos(x)^2-1"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1781
		cos inPlaceMultiplyBy: cos; inPlaceTimesTwoPower: 1; inPlaceSubtract: one].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1782
	^cos
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1783
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1784
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1785
digitCompare: b 
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1786
	"both are positive or negative.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1787
	answer +1 if i am of greater magnitude, -1 if i am of smaller magnitude, 0 if equal magnitude"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1788
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1789
	| compare |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1790
	self isZero
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1791
		ifTrue: [b isZero
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1792
				ifTrue: [^ 0]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1793
				ifFalse: [^ -1]].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1794
	b isZero
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1795
		ifTrue: [^ 1].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1796
	compare _ (self exponent - b exponent) sign.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1797
	^ compare = 0
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1798
		ifTrue: [(self abs - b abs) sign]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1799
		ifFalse: [compare]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1800
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1801
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1802
inPlaceAbs
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1803
	mantissa _ mantissa abs
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1804
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  1805
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1806
inPlaceAdd: b 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1807
    | delta |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1808
    
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1809
    b isZero ifTrue: [^self roundToPrecision].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1810
    self isZero ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1811
        mantissa _ b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1812
        biasedExponent _ b biasedExponent
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1813
    ] ifFalse:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1814
        biasedExponent = b biasedExponent ifTrue: [
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1815
            mantissa _ mantissa + b mantissa
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1816
        ] ifFalse:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1817
            "check for early truncation. beware, keep 2 bits for rounding"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1818
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1819
            delta _ biasedExponent - b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1820
            delta - 2 > (precision max: self precisionInMantissa) ifFalse:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1821
                delta negated - 2 > (precision max: b precisionInMantissa) ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1822
                    mantissa _ b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1823
                    biasedExponent _ b exponent
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1824
                ] ifFalse:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1825
                    delta _ biasedExponent - b exponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1826
                    delta > 0 ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1827
                        mantissa _ (self shift: mantissa by: delta) + b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1828
                        biasedExponent _ biasedExponent - delta
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1829
                    ] ifFalse: [
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1830
                        mantissa _ mantissa + (self shift: b mantissa by: delta negated)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1831
                    ]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1832
                ]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1833
            ]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1834
        ]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1835
    ].
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1836
    self roundToPrecision
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1837
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1838
    "Created: / 26-05-2019 / 03:44:50 / Claus Gittinger"
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1839
    "Modified: / 28-05-2019 / 08:49:15 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1840
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1841
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1842
inPlaceAddNoRound: b 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1843
    | delta |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1844
    
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1845
    b isZero ifTrue: [^self].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1846
    self isZero ifTrue:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1847
        mantissa := b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1848
        biasedExponent := b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1849
        ^ self.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1850
    ].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1851
    delta := biasedExponent - b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1852
    delta isZero ifTrue: [
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1853
        mantissa := mantissa + b mantissa
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1854
    ] ifFalse:[
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1855
        delta > 0 ifTrue: [
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1856
            mantissa := (self shift: mantissa by: delta) + b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1857
            biasedExponent := biasedExponent - delta
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1858
        ] ifFalse: [
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1859
            mantissa := mantissa + (self shift: b mantissa by: delta negated)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1860
        ]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1861
    ]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1862
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1863
    "Created: / 26-05-2019 / 03:41:29 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1864
    "Modified: / 27-05-2019 / 16:39:21 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1865
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1866
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1867
inPlaceCopy: b 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1868
    "copy another arbitrary precision float into self"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1869
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1870
    mantissa := b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1871
    biasedExponent := b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1872
    precision := b precision
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1873
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1874
    "Created: / 26-05-2019 / 03:39:04 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1875
    "Modified: / 27-05-2019 / 16:39:24 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1876
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1877
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1878
inPlaceDivideBy: y 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1879
    "Reference: Accelerating Correctly Rounded Floating-Point Division when the Divisor
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1880
     Is Known in Advance - Nicolas Brisebarre,
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1881
     Jean-Michel Muller, Member, IEEE, and
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1882
     Saurabh Kumar Raina -
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1883
     http://perso.ens-lyon.fr/jean-michel.muller/DivIEEETC-aug04.pdf"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1884
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1885
    | zh x q |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1886
    
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1887
    zh := y reciprocal normalize.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1888
    x := self copy.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1889
    self inPlaceMultiplyBy: zh.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1890
    q := self copy.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1891
    "r := "self inPlaceMultiplyBy: y negated andAccumulate: x.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1892
    "q' := "self inPlaceMultiplyBy: zh andAccumulate: q.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1893
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1894
    "ALGO 4
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1895
    | zh r zl |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1896
    zh := b reciprocal.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1897
    r := b negated inPlaceMultiplyBy: zh andAccumulate: (1 asLargeFloatPrecision: precision).
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1898
    zl := (b asLargeFloatPrecision: precision + 1) reciprocal inPlaceMultiplyBy: r.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1899
    self inPlaceMultiplyBy: zh andAccumulate: (zl inPlaceMultiplyBy: self)"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1900
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1901
    "Created: / 26-05-2019 / 03:38:41 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1902
    "Modified: / 27-05-2019 / 10:12:13 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1903
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1904
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1905
inPlaceMultiplyBy:b
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1906
    self inPlaceMultiplyNoRoundBy:b.
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1907
    self roundToPrecision
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1908
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1909
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1910
     2.4 asLargeFloat inPlaceMultiplyBy:2.0
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1911
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1912
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1913
    "Created: / 26-05-2019 / 03:37:36 / Claus Gittinger"
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1914
    "Modified: / 28-05-2019 / 08:49:04 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1915
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1916
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1917
inPlaceMultiplyBy:b andAccumulate:c 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1918
    "only do rounding after the two operations.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1919
     This is the traditional muladd operation in aritmetic units"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1920
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1921
    self inPlaceMultiplyNoRoundBy: b.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1922
    self inPlaceAdd:c
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1923
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1924
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1925
     2.4 asLargeFloat inPlaceMultiplyBy:2.0 asLargeFloat andAccumulate:10.0 asLargeFloat
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1926
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1927
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1928
    "Created: / 26-05-2019 / 03:37:16 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1929
    "Modified (comment): / 27-05-2019 / 16:35:43 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1930
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1931
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1932
inPlaceMultiplyNoRoundBy:b
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1933
    mantissa := mantissa * b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1934
    biasedExponent := biasedExponent + b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1935
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1936
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1937
     2.4 asLargeFloat inPlaceMultiplyNoRoundBy:2.0
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1938
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1939
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1940
    "Created: / 26-05-2019 / 03:36:00 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1941
    "Modified: / 27-05-2019 / 16:39:27 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1942
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1943
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1944
inPlaceNegated
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1945
    "destructive"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1946
    
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1947
    mantissa := mantissa negated
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1948
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1949
    "Created: / 26-05-2019 / 03:34:34 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1950
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1951
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1952
inPlaceReciprocal
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1953
        | ma h |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1954
        self isZero ifTrue: [(ZeroDivide dividend: self) signal].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1955
        ma := mantissa abs.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1956
        h := ma highBit.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1957
        mantissa := (1 bitShift: h + precision) + ma quo: (self shift: mantissa by: 1).
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1958
        biasedExponent := biasedExponent negated - h - precision + 1.
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1959
        self roundToPrecision
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1960
        
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1961
        "Implementation notes: if m is a power of 2, reciprocal is trivial.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1962
        Else, we have 2^h > m >2^(h-1)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1963
        thus 1 < 2^h/m < 2.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1964
        thus 2^(n-1) < 2^(h+n-1)/m < 2^n
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1965
        We thus have to evaluate (2^(h+n-1)/m) rounded
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1966
        Tie is away from zero because there are always trailing bits (inexact op)
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1967
        (num/den) rounded is also ((num/den)+(sign/2)) truncated
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1968
        or (num*2)+(sign*den) quo: den*2
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1969
        That's finally what we evaluate"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1970
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1971
    "Modified: / 28-05-2019 / 08:48:59 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1972
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1973
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1974
inPlaceSqrt
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1975
        "Replace the receiver by its square root."
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1976
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1977
        | guess guessSquared delta shift |
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1978
        self negative 
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1979
                ifTrue: 
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1980
                        [^ DomainError signal: 'sqrt undefined for number less than zero.'].
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1981
        self isZero ifTrue: [^self].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  1982
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1983
        shift := 2 * precision - mantissa highBit.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1984
        biasedExponent := biasedExponent - shift.
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1985
        biasedExponent odd
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1986
                ifTrue:
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1987
                        [shift := shift + 1.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1988
                        biasedExponent := biasedExponent - 1].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1989
        mantissa := mantissa bitShift: shift.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1990
        guess := mantissa bitShift: (mantissa highBit + 1) // 2.
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1991
        [
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1992
                guessSquared := guess * guess.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1993
                delta := guessSquared - mantissa quo: (guess bitShift: 1).
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1994
                delta = 0 ] whileFalse:
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1995
                        [ guess := guess - delta ].
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1996
        guessSquared = mantissa
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  1997
                ifFalse:
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1998
                        [(guessSquared - guess - mantissa) negative ifFalse: [guess := guess - 1]].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  1999
        mantissa := guess.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2000
        biasedExponent := biasedExponent quo: 2.
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2001
        self roundToPrecision
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2002
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2003
    "Modified: / 28-05-2019 / 08:48:55 / Claus Gittinger"
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2004
    "Modified (format): / 28-05-2019 / 16:17:39 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2005
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2006
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2007
inPlaceSubtract: b 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2008
        | delta |
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2009
        b isZero ifTrue: [^self roundToPrecision].
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2010
        self isZero 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2011
                ifTrue: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2012
                        [mantissa _ b mantissa negated.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2013
                        biasedExponent _ b biasedExponent]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2014
                ifFalse: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2015
                        [biasedExponent = b biasedExponent
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2016
                                ifTrue: [mantissa _ mantissa - b mantissa]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2017
                                ifFalse: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2018
                                        ["check for early truncation. beware, keep 2 bits for rounding"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2019
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2020
                                        delta _ biasedExponent - b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2021
                                        delta - 2 > (precision max: self precisionInMantissa) 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2022
                                                ifFalse: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2023
                                                        [delta negated - 2 > (precision max: b precisionInMantissa) 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2024
                                                                ifTrue: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2025
                                                                        [mantissa _ b mantissa negated.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2026
                                                                        biasedExponent _ b biasedExponent]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2027
                                                                ifFalse: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2028
                                                                        [delta _ biasedExponent - b biasedExponent.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2029
                                                                        delta >= 0 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2030
                                                                                ifTrue: 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2031
                                                                                        [mantissa _ (self shift: mantissa by: delta) - b mantissa.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2032
                                                                                        biasedExponent _ biasedExponent - delta]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2033
                                                                                ifFalse: [mantissa _ mantissa - (self shift: b mantissa by: delta negated)]]]]].
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2034
        self roundToPrecision
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2035
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2036
    "Modified: / 28-05-2019 / 08:48:46 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2037
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2038
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2039
inPlaceSubtractNoRound: b 
24218
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2040
        | delta |
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2041
        b isZero ifTrue: [^self].
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2042
        self isZero 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2043
                ifTrue: 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2044
                        [mantissa := b mantissa negated.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2045
                        biasedExponent := b biasedExponent]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2046
                ifFalse: 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2047
                        [delta := biasedExponent - b biasedExponent.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2048
                        delta isZero 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2049
                                ifTrue: [mantissa := mantissa - b mantissa]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2050
                                ifFalse: 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2051
                                        [delta >= 0 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2052
                                                ifTrue: 
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2053
                                                        [mantissa := (self shift: mantissa by: delta) - b mantissa.
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2054
                                                        biasedExponent := biasedExponent - delta]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2055
                                                ifFalse: [mantissa := mantissa - (self shift: b mantissa by: delta negated)]]]
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2056
7c7369cb0189 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24217
diff changeset
  2057
    "Modified (format): / 28-05-2019 / 16:17:47 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2058
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2059
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2060
inPlaceTimesTwoPower: n 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2061
	self isZero
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2062
		ifFalse: [biasedExponent _ biasedExponent + n]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2063
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2064
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2065
mantissa:mantissaArg exponent:exponentArg  
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2066
    "set instance variables.
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2067
     Notice, that the float's value is m * 2^e"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2068
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2069
    biasedExponent := exponentArg.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2070
    mantissa := mantissaArg.
24208
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2071
    precision := self class defaultPrecision.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2072
    self normalize.
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2073
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2074
    "Modified (comment): / 17-07-2017 / 14:50:14 / cg"
24208
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2075
    "Modified: / 28-05-2019 / 09:20:11 / Claus Gittinger"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2076
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2077
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2078
mantissa:mantissaArg exponent:exponentArg precision:precisionArg  
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2079
    "set instance variables.
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2080
     Notice, that the float's value is m * 2^e"
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2081
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2082
    biasedExponent := exponentArg.
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2083
    mantissa := mantissaArg.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2084
    precision := precisionArg.
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2085
    self roundToPrecision "/ normalize
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2086
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2087
    "Modified (comment): / 17-07-2017 / 14:50:10 / cg"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2088
    "Modified: / 28-05-2019 / 11:19:14 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2089
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2090
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2091
moduloNegPiToPi
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2092
	"answer a copy of the receiver modulo 2*pi, with doubled precision"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2093
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2094
	| x pi twoPi quo |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2095
	x _ (self asLargeFloatPrecision: precision * 2).
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2096
	self negative ifTrue: [x inPlaceNegated].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2097
	pi _ x pi.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2098
	twoPi _ pi timesTwoPower: 1.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2099
	x > pi ifTrue:
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2100
		[quo _ x + pi quo: twoPi.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2101
		quo highBitOfMagnitude > precision ifTrue:
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2102
			[x _ (self abs asLargeFloatPrecision: precision + quo highBitOfMagnitude).
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2103
			pi _ x pi.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2104
			twoPi _ pi timesTwoPower: 1.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2105
			quo _ x + pi quo: twoPi].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2106
		x inPlaceSubtract: twoPi * quo.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2107
		self negative ifTrue: [x inPlaceNegated]].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2108
	^x asLargeFloatPrecision: precision * 2
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2109
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2110
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2111
normalize
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2112
    "adjust m & e such that m is the smallest possible 
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2113
     (i.e. has no least significant zero bit).
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2114
     Notice, that the float's value is m * 2^e"
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2115
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2116
    |shift|
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2117
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2118
    shift := mantissa lowBit - 1.
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2119
    shift > 0 ifTrue:[
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2120
        mantissa := mantissa bitShift:shift negated.
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2121
        biasedExponent := biasedExponent + shift
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2122
    ].
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2123
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2124
    "
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2125
     self mantissa:1 exponent:0
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2126
     self mantissa:2 exponent:0
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2127
     self mantissa:4 exponent:0  
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2128
     self mantissa:8 exponent:0  
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2129
     self mantissa:10 exponent:-1
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2130
     self mantissa:10 exponent:0 
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2131
     self mantissa:10 exponent:1 
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2132
     self mantissa:-10 exponent:1 
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2133
    "
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2134
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2135
    "Modified (comment): / 26-05-2019 / 03:34:00 / Claus Gittinger"
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2136
!
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2137
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2138
powerExpansionArCoshp1Precision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2139
	"Evaluate arcosh(x+1)/sqrt(2*x) for the receiver x by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2140
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2141
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2142
	| one two count count2 sum term term1 term2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2143
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2144
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2145
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2146
	count2 _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2147
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2148
	term1 _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2149
	term2 _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2150
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2151
	[term1 inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2152
	term1 inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2153
	term2 inPlaceMultiplyBy: count2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2154
	term2 inPlaceMultiplyBy: count2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2155
	term2 inPlaceDivideBy: count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2156
	count inPlaceAdd: one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2157
	count2 inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2158
	term2 inPlaceDivideBy: count2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2159
	term2 inPlaceTimesTwoPower: -2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2160
	term _ term1 * term2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2161
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2162
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2163
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2164
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2165
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2166
powerExpansionArSinhPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2167
	"Evaluate the area hypebolic sine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2168
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2169
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2170
	| one x2 two count sum term |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2171
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2172
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2173
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2174
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2175
	term _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2176
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2177
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2178
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2179
	term inPlaceMultiplyBy: count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2180
	term inPlaceDivideBy: count + one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2181
	term inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2182
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2183
	sum inPlaceAdd: term / count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2184
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2185
	sum inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2186
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2187
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2188
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2189
powerExpansionArTanhPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2190
	"Evaluate the area hyperbolic tangent of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2191
	arTanh (x) = x (1 + x^2/3 + x^4/5 + ... ) for -1 < x < 1
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2192
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2193
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2194
	| one x2 two count sum term |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2195
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2196
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2197
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2198
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2199
	term _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2200
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2201
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2202
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2203
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2204
	sum inPlaceAdd: term / count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2205
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2206
	sum inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2207
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2208
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2209
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2210
powerExpansionArcSinPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2211
	"Evaluate the arc sine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2212
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2213
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2214
	| one x2 two count sum term |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2215
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2216
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2217
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2218
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2219
	term _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2220
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2221
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2222
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2223
	term inPlaceMultiplyBy: count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2224
	term inPlaceDivideBy: count + one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2225
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2226
	sum inPlaceAdd: term / count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2227
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2228
	sum inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2229
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2230
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2231
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2232
powerExpansionArcTanPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2233
	"Evaluate the arc tangent of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2234
	arcTan (x) = x (1 - x^2/3 + x^4/5 - ... ) for -1 < x < 1
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2235
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2236
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2237
	| count one sum term two x2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2238
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2239
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2240
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2241
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2242
	term _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2243
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2244
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2245
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2246
	term inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2247
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2248
	sum inPlaceAdd: term / count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2249
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2250
	sum inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2251
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2252
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2253
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2254
powerExpansionCosPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2255
	"Evaluate the cosine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2256
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2257
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2258
	| count one sum term two x2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2259
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2260
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2261
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2262
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2263
	term _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2264
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2265
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2266
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2267
	term inPlaceDivideBy: count * (count + one).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2268
	term inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2269
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2270
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2271
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2272
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2273
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2274
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2275
powerExpansionCoshPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2276
	"Evaluate the hyperbolic cosine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2277
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2278
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2279
	| count one sum term two x2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2280
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2281
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2282
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2283
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2284
	term _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2285
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2286
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2287
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2288
	term inPlaceDivideBy: count * (count + one).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2289
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2290
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2291
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2292
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2293
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2294
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2295
powerExpansionLnPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2296
	"Evaluate the neperian logarithm of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2297
	For quadratic convergence, use:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2298
	ln ((1+y)/(1-y)) = 2 y (1 + y^2/3 + y^4/5 + ... ) = 2 ar tanh( y )
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2299
	(1+y)/(1-y) = self => y = (self-1)/(self+1)
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2300
	This algorithm is interesting when the receiver is close to 1"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2301
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2302
	| one |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2303
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2304
	^((self - one)/(self + one) powerExpansionArTanhPrecision: precBits) timesTwoPower: 1
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2305
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2306
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2307
powerExpansionSinCosPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2308
	"Evaluate the sine and cosine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2309
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2310
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2311
	| count one sin cos term |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2312
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2313
	count _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2314
	cos _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2315
	sin _ self copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2316
	term _ self copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2317
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2318
	[count inPlaceAdd: one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2319
	term
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2320
		inPlaceMultiplyBy: self;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2321
		inPlaceDivideBy: count;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2322
		inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2323
	cos inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2324
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2325
	count inPlaceAdd: one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2326
	term
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2327
		inPlaceMultiplyBy: self;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2328
		inPlaceDivideBy: count.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2329
	sin inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2330
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2331
	term exponent + precBits < sin exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2332
	^Array with: sin with: cos
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2333
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2334
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2335
powerExpansionSinPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2336
	"Evaluate the sine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2337
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2338
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2339
	| count one sum term two x2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2340
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2341
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2342
	count _ two copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2343
	sum _ self copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2344
	term _ self copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2345
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2346
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2347
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2348
	term inPlaceDivideBy: count * (count + one).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2349
	term inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2350
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2351
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2352
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2353
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2354
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2355
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2356
powerExpansionSinhPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2357
	"Evaluate the hyperbolic sine of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2358
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2359
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2360
	| count one sum term two x2 |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2361
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2362
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2363
	count _ two copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2364
	sum _ self copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2365
	term _ self copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2366
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2367
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2368
	[term inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2369
	term inPlaceDivideBy: count * (count + one).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2370
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2371
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2372
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2373
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2374
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2375
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2376
powerExpansionTanPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2377
	"Evaluate the tangent of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2378
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2379
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2380
	| count one sum term pow two x2 seidel |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2381
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2382
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2383
	count _ two copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2384
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2385
	pow _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2386
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2387
	seidel _ OrderedCollection new: 256.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2388
	seidel add: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2389
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2390
	[pow inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2391
	pow inPlaceDivideBy: count * (count + one).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2392
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2393
	2 to: seidel size do: [:i | seidel at: i put: (seidel at: i-1) + (seidel at: i)].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2394
	seidel addLast: seidel last.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2395
	seidel size to: 2 by: -1 do: [:i | seidel at: i - 1 put: (seidel at: i-1) + (seidel at: i)].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2396
	seidel addFirst: seidel first.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2397
	term _ pow * seidel first.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2398
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2399
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2400
	sum inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2401
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2402
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2403
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2404
powerExpansionTanhPrecision: precBits
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2405
	"Evaluate the hyperbolic tangent of the receiver by power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2406
	The algorithm is interesting when the receiver is close to zero"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2407
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2408
	| count one sum term pow two x2 seidel |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2409
	one _ self one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2410
	two _ one timesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2411
	count _ two copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2412
	sum _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2413
	pow _ one copy.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2414
	x2 _ self squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2415
	seidel _ OrderedCollection new: 256.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2416
	seidel add: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2417
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2418
	[pow inPlaceMultiplyBy: x2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2419
	pow inPlaceDivideBy: count * (count + one).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2420
	pow inPlaceNegated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2421
	count inPlaceAdd: two.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2422
	2 to: seidel size do: [:i | seidel at: i put: (seidel at: i-1) + (seidel at: i)].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2423
	seidel addLast: seidel last.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2424
	seidel size to: 2 by: -1 do: [:i | seidel at: i - 1 put: (seidel at: i-1) + (seidel at: i)].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2425
	seidel addFirst: seidel first.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2426
	term _ pow * seidel first.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2427
	sum inPlaceAdd: term.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2428
	term exponent + precBits < sum exponent] whileFalse.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2429
	sum inPlaceMultiplyBy: self.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2430
	^sum
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2431
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2432
22041
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2433
precision:precisionArg  
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2434
    "set instance variables.
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2435
     Notice, that the float's value is m * 2^e"
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2436
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2437
    precision := precisionArg.
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2438
    self normalize
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2439
289126e142ef #REFACTORING by cg
Claus Gittinger <cg@exept.de>
parents: 21902
diff changeset
  2440
    "Created: / 17-07-2017 / 14:50:04 / cg"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2441
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2442
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2443
precisionInMantissa
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2444
    "this is equal to precision only if we are normalized.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2445
     If we are reduced (low bits being zero are removed), then it will be less.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2446
     If we haven't been rounded/truncated then it will be more"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2447
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2448
    ^ mantissa highBitOfMagnitude
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2449
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2450
    "Created: / 26-05-2019 / 03:45:02 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2451
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2452
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2453
reduce
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2454
	"remove trailing zero bits from mantissa so that we can do arithmetic on smaller integer
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2455
	(that will un-normalize self)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2456
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2457
	| trailing |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2458
	trailing _ mantissa abs lowBit - 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2459
	trailing > 0
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2460
		ifFalse: [ ^ self ].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2461
	mantissa _ self shift: mantissa by: trailing negated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2462
	biasedExponent _ biasedExponent + trailing
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2463
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2464
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2465
roundToPrecision
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2466
    "destructive inplace round
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2467
     apply algorithm round to nearest even used by IEEE arithmetic"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2468
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2469
    "inexact := ma lowBit <= excess."
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2470
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2471
    | excess ma carry |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2472
    
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2473
    mantissa isZero ifTrue: [ 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2474
        biasedExponent := 0.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2475
        ^ self 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2476
    ].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2477
    ma := mantissa abs.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2478
    excess := ma highBit - precision.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2479
    excess > 0 ifFalse: [ ^ self ].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2480
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2481
    carry := ma bitAt: excess.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2482
    mantissa := self shift: mantissa by: excess negated.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2483
    biasedExponent := biasedExponent + excess.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2484
    (carry = 1 and: [ mantissa odd or: [ ma lowBit < excess ] ]) ifFalse: [ ^ self ].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2485
    mantissa := mantissa + mantissa sign.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2486
    self truncate
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2487
24207
7ba9f5fc6b7d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24202
diff changeset
  2488
    "Created: / 28-05-2019 / 08:49:25 / Claus Gittinger"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2489
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2490
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2491
shift:m by:d
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2492
    "shift mantissa m absolute value by some d bits, then restore sign"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2493
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2494
    ^m negative
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2495
            ifTrue: [(m negated bitShift:d) negated]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2496
            ifFalse: [m bitShift:d]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2497
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2498
    "Created: / 26-05-2019 / 03:22:12 / Claus Gittinger"
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2499
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2500
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2501
sin: x
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2502
	"Evaluate the sine of x by sin(5x) formula and power series expansion."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2503
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2504
	| sin sin2 sin4 fifth five |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2505
	x isZero ifTrue: [^x zero].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2506
	five _ 5 asLargeFloatPrecision: x precision.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2507
	fifth _ x / five.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2508
	sin _ fifth powerExpansionSinPrecision: precision + 8.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2509
	sin2 _ sin squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2510
	sin2 inPlaceTimesTwoPower: 2.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2511
	sin4 _ sin2 squared.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2512
	sin2 inPlaceMultiplyBy: five.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2513
	^sin4
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2514
		inPlaceSubtract: sin2;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2515
		inPlaceAdd: five;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2516
		inPlaceMultiplyBy: sin;
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2517
		yourself
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2518
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2519
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2520
sincos: x
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2521
	"Evaluate the sine and cosine of x by recursive sin(2x) and cos(2x) formula and power series expansion.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2522
	Note that it is better to use this method with x <= pi/4."
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2523
	
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2524
	| one sin cos sincos fraction power |
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2525
	x isZero ifTrue: [^Array with: x zero with: x one].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2526
	power _ ((precision bitShift: -1) + x exponent max: 0) highBit.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2527
	fraction _ x timesTwoPower: power negated.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2528
	sincos _ fraction powerExpansionSinCosPrecision: precision + (1 bitShift: 1 + power).
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2529
	sin _ sincos first.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2530
	cos _ sincos last.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2531
	one _ x one.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2532
	power timesRepeat:
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2533
		["Evaluate sin(2x)=2 sin(x) cos(x)"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2534
		sin inPlaceMultiplyBy: cos; inPlaceTimesTwoPower: 1.
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2535
		"Evaluate cos(2x)=2 cos(x)^2-1"
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2536
		cos inPlaceMultiplyBy: cos; inPlaceTimesTwoPower: 1; inPlaceSubtract: one].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2537
	^sincos
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2538
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2539
8634
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2540
!LargeFloat methodsFor:'queries'!
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2541
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2542
epsilon
21902
f6dbcc8f2757 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21803
diff changeset
  2543
    "return the maximum relative spacing of instances of mySelf
f6dbcc8f2757 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21803
diff changeset
  2544
     (i.e. the value-delta of the least significant bit)"
8634
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2545
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2546
    |p|
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2547
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2548
    p := precision.
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2549
    p isFinite ifTrue:[
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2550
        ^ self class radix asFloat raisedTo:(1 - p)
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2551
    ].
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  2552
    
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  2553
    "/ mhmh - what should we use here for an infinite precision ???
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  2554
    ^ 1e-300
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  2555
    "/ ^ LongFloat epsilon
21902
f6dbcc8f2757 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21803
diff changeset
  2556
22299
0ae55bd04f33 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22108
diff changeset
  2557
    "Modified: / 10-10-2017 / 15:55:12 / cg"
24208
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2558
!
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2559
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2560
numBitsInMantissa
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2561
    ^ precision
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2562
b029f2fd3a8b #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24207
diff changeset
  2563
    "Created: / 28-05-2019 / 09:14:36 / Claus Gittinger"
8634
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2564
! !
2c838074e754 epsilon
Claus Gittinger <cg@exept.de>
parents: 7552
diff changeset
  2565
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2566
!LargeFloat methodsFor:'testing'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2567
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2568
isAnExactFloat
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2569
	^self exponent <= Float emax
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2570
		and: [Float emin - Float precision < self exponent
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2571
		and: [precision <= Float precision or: [mantissa isAnExactFloat]]]
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2572
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2573
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2574
isFinite
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2575
    ^ mantissa ~= 0 or:[biasedExponent = 0]
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2576
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2577
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2578
isInfinite
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2579
    ^ mantissa = 0 and:[biasedExponent ~= 0]
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2580
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2581
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2582
isNaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2583
    ^ self == NaN
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2584
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2585
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2586
isZero
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2587
	^mantissa isZero
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2588
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2589
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2590
negative
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2591
    "return true if the receiver is negative"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2592
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2593
    mantissa == 0 ifTrue:[ ^ biasedExponent negative].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2594
    ^ mantissa negative
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2595
!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2596
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2597
positive
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2598
	^mantissa positive
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2599
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2600
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2601
sign
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2602
    "return the sign of the receiver"
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2603
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2604
    mantissa == 0 ifTrue:[ 
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2605
        "special value for infinites"
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2606
        ^ biasedExponent sign
7546
af752ee13420 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 7459
diff changeset
  2607
    ].
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2608
    ^ mantissa sign
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2609
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2610
24202
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2611
!LargeFloat methodsFor:'truncation & rounding'!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2612
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2613
truncate
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2614
    "remove trailing bits if they exceed our allocated number of bits"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2615
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2616
    | excess |
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2617
    excess := precision - precision.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2618
    excess > 0 ifFalse: [ ^ self ].
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2619
    mantissa := self shift:mantissa by:excess negated.
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2620
    biasedExponent := biasedExponent + excess
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2621
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2622
    "Created: / 26-05-2019 / 03:24:10 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2623
!
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2624
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2625
truncated
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2626
    "answer the integer that is nearest to self in the interval between zero and self"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2627
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2628
    ^ biasedExponent negated > precision 
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2629
            ifTrue: [0]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2630
            ifFalse: [self shift: mantissa by: biasedExponent]
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2631
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2632
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2633
     2.4 asLargeFloat truncated
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2634
     2e34 asLargeFloat truncated
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2635
    "
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2636
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2637
    "Created: / 26-05-2019 / 03:21:52 / Claus Gittinger"
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2638
! !
86ba287c1a1d #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 23739
diff changeset
  2639
24217
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2640
!LargeFloat methodsFor:'truncation and round off'!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2641
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2642
predecessor
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2643
	mantissa = 0 ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2644
	mantissa negative ifTrue: [^self negated successor negated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2645
	^mantissa isPowerOfTwo
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2646
		ifTrue: [self - (self ulp timesTwoPower: -1)]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2647
		ifFalse: [self - self ulp]
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2648
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2649
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2650
successor
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2651
	mantissa = 0 ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2652
	mantissa negative ifTrue: [^self negated predecessor negated].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2653
	^self + self ulp
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2654
!
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2655
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2656
ulp
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2657
	mantissa = 0 ifTrue: [^self].
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2658
	^self one timesTwoPower: self exponent - precision + 1
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2659
! !
019d3192fecf #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 24208
diff changeset
  2660
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2661
!LargeFloat class methodsFor:'documentation'!
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2662
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2663
version
21803
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
  2664
    ^ '$Header$'
22042
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  2665
!
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  2666
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  2667
version_CVS
3059445c3a80 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 22041
diff changeset
  2668
    ^ '$Header$'
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2669
! !
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2670
21803
63325b999dbf #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 8634
diff changeset
  2671
7445
be414e075c9a initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  2672
LargeFloat initialize!