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) |