Class new title: Float subclassof: Number fields: '' declare: 'halfpi sqrt2 twopi fourthpi degreesPerRadian pi radiansPerDegree ln2 '; bytesize: true  t1 [self  t1 asFloat] primitive: 4  t1 [self  t1 asFloat] primitive: 7  t1 [self  t1 asFloat] primitive: 5 * t1 [self * t1 asFloat] primitive: 8 + t1 [self + t1 asFloat] - t1 [self - t1 asFloat] primitive: 1 / t1 [0.0 = t1  [user notify: 'Attempt to divide by 0.0'] self / t1 asFloat] primitive: 9 < t1 [self < t1 asFloat] primitive: 2 = t1 [t1 isNumber  [self = t1 asFloat] false] primitive: 6 > t1 [self > t1 asFloat] primitive: 3 \ t1 [self < 0.0  [(self / t1) ipart + 1.0 * t1 + self] self - ((self / t1) ipart * t1)] absprinton: t1 digits: t2 | t3 t4 t5 t6 t7 [t5 _ [self < 1.0  [0 - (10.0 / self epart: 10.0)] self epart: 10.0]. t4 _ self / (10.0 ipow: t5). t3 _ 10.0 ipow: 1 - t2. t4 _ 0.5 * t3 + t4. [t4  10.0  [t4 _ t4 / 10.0. t5 _ t5 + 1]]. [t5 < 6 and t5 > 4  [t6 _ 0. t5 < 0  [t1 append: '0.0000'  (1 to: 1 - t5)]] t6 _ t5. t5 _ 0]. while t4  t3 do [t7 _ t4 asInteger. t1 next_ 48 + t7. t4 _ t4 - t7 * 10.0. t3 _ t3 * 10.0. t5 _ t5 - 1. t5 = 1  [t1 append: '.']]. while t5  1 do [t1 next_ 48. t5 _ t5 - 1. t5 = 1  [t1 append: '.']]. t6  0  [t1 append: 'e'. t1 print: t6]] arctan | t1 t2 t3 t4 t5 [self = 1.0  [45.0] self = 1.0  [45.0] [self * self > 1.0  [t1 _ halfpi. t3 _ 1.0 / (self * self). t2 _ 1.0 / self abs] t1 _ 0.0. t3 _ 0.0 - (self * self). t2 _ self abs]. t5 _ 1. t4 _ 1.0e4. while t2 abs > t4 do [t1 _ t1 + t2. t2 _ t2 * t3 * t5 asFloat / (t5 + 2) asFloat. t5 _ t5 + 2]. t1 _ self sign asFloat * t1 * 360.0 / twopi. t1] asDegrees [self / radiansPerDegree] asDirection [self cos  self sin] asFloat asInteger [(self / 10000.0) asInteger * 10000 + (self \ 10000.0) asInteger] primitive: 33 asLarge | t1 t2 t3 t4 [self < 0  [(0.0 - self) asLarge negated] t2 _ Stream default. [self = 0.0  [t2 next_ 0] t1 _ self ipart. while t1  1 do [t2 next_ (t1 \ 256.0) asInteger. t1 _ t1 / 256.0]]. t2 _ t2 contents. t3 _ Natural new: t2 length. for t4 to: t2 length do [t3  t4 _ t2  t4]. LargeInteger new bytes: t3 neg: false] asRadians [self * radiansPerDegree] classInit [pi _ 3.1415927. halfpi _ pi / 2.0. fourthpi _ pi / 4.0. twopi _ pi * 2.0. radiansPerDegree _ pi / 180.0. degreesPerRadian _ 180.0 / pi. ln2 _ 0.69314718. sqrt2 _ 1.4142136] copy cos [self < 0.0  [(self + halfpi) sin] (halfpi - self) sin] epart: t1 | t2 [self < t1  [0] self < (t1 * t1)  [1] t2 _ 2 * (self epart: t1 * t1). t2 + (self / (t1 ipow: t2) epart: t1)] exp | t1 t2 t3 t4 t5 t6 [self abs > 9212.0  [user notify: 'exp overflow'] t3 _ self / ln2. t2 _ Float new. t2 instfield: 1 _ t3 asInteger * 2. t3 _ t3 fpart. [t3  0.5  [t2 _ t2 * sqrt2. t3 _ t3 - 0.5]]. t4 _ t3 * t3. t6 _ 0.0. t5 _ t6. for t1 from: (28.875564 2525.0429 ) do [t5 _ t5 * t4 + t1]. for t1 from: (1.0 375.02165 7285.7336 ) do [t6 _ t6 * t4 + t1]. t2 * (t6 + (t3 * t5) / (t6 - (t3 * t5)))] fpart [user croak] primitive: 35 ipart [self - self fpart] ipow: t1 [t1 = 0  [1.0] t1 = 1  [self] t1 > 1  [(self * self ipow: t1 / 2) * (self ipow: t1 \ 2)] 1.0 / (self ipow: 0 - t1)] ln | t1 t2 t3 t4 t5 [self  0.0  [user notify: 'ln not valid for ' + self asString] t2 _ self + 0.0. t4 _ ln2 * (((t2 instfield: 1) / 2) asFloat - 0.5). t2 instfield: 1 _ 0. t2 _ t2 * sqrt2. t2 _ t2 - 1.0 / (t2 + 1.0). t3 _ t2 * t2. t5 _ 0.0. for t1 from: (0.23762456 0.28525381 0.40000598 0.66666664 2.0 ) do [t5 _ t5 * t3 + t1]. t4 + (t2 * t5)] log: t1 [self ln / t1 asFloat ln] near: t1 [self near: t1 within: 1.0e4] near: t1 within: t2 [(self - t1) abs  t2] neg [self negated] negated [0.0 - self] printon: t1 [self printon: t1 digits: 8] printon: t1 digits: t2 [self > 0.0  [self absprinton: t1 digits: t2] self = 0.0  [t1 append: '0.0'] t1 append: ''. 0.0 - self absprinton: t1 digits: t2] recopy round [(self + [self < 0  [0.5] 0.5]) asInteger] roundTo: t1 [(self / t1 + [self < 0.0  [0.5] 0.5]) ipart * t1] sameAs: t1 [self = t1] sin | t1 t2 t3 t4 [self < 0.0  [self negated sin negated] self > twopi  [(self \ twopi) sin] self > pi  [(self - pi) sin negated] self > halfpi  [(pi - self) sin] t1 _ self. t3 _ t1. t2 _ t1 * t1. for t4 from: (0.16666667 0.0083333315 1.98409e4 2.7526e6 2.39e8 ) do [t1 _ t1 * t2. t3 _ t4 * t1 + t3]. t3] sqrt | t1 t2 [[self  0.0  [self = 0.0  [0.0] user notify: 'sqrt invalid for x<0.']]. t1 _ self + 0.0. t1 instfield: 1 _ (t1 instfield: 1) / 4 * 2. for t2 to: 5 do [t1 _ self - (t1 * t1) / (t1 * 2.0) + t1]. t1] tan | t1 t2 t3 t4 [self < 0.0  [self negated tan negated] self > pi  [(self \ pi) tan] self > halfpi  [(self - halfpi) tan negated] self > fourthpi  [1.0 / (halfpi - self) tan] t1 _ self. t3 _ t1. t2 _ t1 * t1. for t4 from: (0.3333314 0.1333924 0.05337406 0.024565089 0.002900525 0.0095168091 ) do [t1 _ t1 * t2. t3 _ t4 * t1 + t3]. t3] | t1 [(self / t1) ipart * t1]