Fraction.st
changeset 24982 f64317156f40
parent 24931 843e3aaea193
child 24995 1e0f6b44c6af
equal deleted inserted replaced
24981:2bf781ee06db 24982:f64317156f40
     1 "{ Encoding: utf8 }"
       
     2 
       
     3 "
     1 "
     4  COPYRIGHT (c) 1989 by Claus Gittinger
     2  COPYRIGHT (c) 1989 by Claus Gittinger
     5 	      All Rights Reserved
     3 	      All Rights Reserved
     6 
     4 
     7  This software is furnished under a license and may be used
     5  This software is furnished under a license and may be used
   817       180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
   815       180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
   818 	 asLongFloat
   816 	 asLongFloat
   819     "
   817     "
   820 !
   818 !
   821 
   819 
   822 asQuadFloat
       
   823     "return a QuadFloat with (approximately) my value.
       
   824      Since floats have a limited precision, you usually loose bits when doing this."
       
   825 
       
   826     |num den numShift denShift numBits rslt|
       
   827 
       
   828     (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
       
   829         ^ (numerator asQuadFloat) / (denominator asQuadFloat)
       
   830     ].
       
   831 
       
   832     "Do it the hard way: reduce magnitude and undo reduction on the quotient"
       
   833 
       
   834     numBits := QuadFloat precision * 2.    "number of bits to preserve (conservative)"
       
   835     num := numerator abs.
       
   836     numShift := numBits - num highBit. "(num highBit - bits) negated"
       
   837     numShift < 0 ifTrue:[num := num bitShift:numShift] ifFalse:[ numShift := 0].
       
   838 
       
   839     den :=  denominator.
       
   840     denShift := numBits - den highBit. "(den highBit - bits) negated"
       
   841     denShift < 0 ifTrue:[den := den bitShift:denShift] ifFalse:[denShift := 0].
       
   842 
       
   843     rslt := (num asQuadFloat / den asQuadFloat) * (2 raisedToInteger:denShift-numShift).
       
   844     numerator negative ifTrue:[ ^ rslt negated ].
       
   845     ^ rslt.
       
   846 
       
   847     "
       
   848       (5/9) asQuadFloat
       
   849       (-5/9) asQuadFloat
       
   850       (Fraction basicNew setNumerator:500000000000 denominator:900000000000) asQuadFloat = (5/9) asQuadFloat
       
   851       (Fraction basicNew setNumerator:500000000001 denominator:900000000000) asQuadFloat = (5/9) asQuadFloat
       
   852       (500000000001/900000000000) asQuadFloat
       
   853       (-500000000001/900000000000) asQuadFloat
       
   854       (500000000001/900000000000) asQuadFloat = (5/9) asQuadFloat
       
   855 
       
   856       (500000000000/9) asQuadFloat
       
   857       (5/900000000000) asQuadFloat
       
   858       89012345678901234567 asFloat / 123456789123456789 asQuadFloat
       
   859       (89012345678901234567 / 123456789123456789) asQuadFloat
       
   860       (-89012345678901234567 / 123456789123456789) asQuadFloat
       
   861 
       
   862       (
       
   863        180338700661043257034670206806167960222709397862806840937993331366591676308781197477183367018067356365812757479444845320188679437752013593674158587947149815441890236037219685250845721864713487208757788709113534916165172927384095182655935222723385253851776639985379367854545495930551624041981995105743408203125
       
   864         /
       
   865        180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
       
   866       ) asQuadFloat
       
   867 
       
   868       180338700661043257034670206806167960222709397862806840937993331366591676308781197477183367018067356365812757479444845320188679437752013593674158587947149815441890236037219685250845721864713487208757788709113534916165172927384095182655935222723385253851776639985379367854545495930551624041981995105743408203125
       
   869          asQuadFloat /
       
   870       180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
       
   871          asQuadFloat
       
   872     "
       
   873 
       
   874     "Created: / 07-06-2019 / 02:32:19 / Claus Gittinger"
       
   875 !
       
   876 
       
   877 asShortFloat
   820 asShortFloat
   878     "return a short float with (approximately) my value"
   821     "return a short float with (approximately) my value"
   879 
   822 
   880     (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
   823     (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
   881 	^ (numerator asShortFloat) / (denominator asShortFloat)
   824 	^ (numerator asShortFloat) / (denominator asShortFloat)