|
1 "{ Package: 'stx:libbasic2' }" |
|
2 |
|
3 "{ NameSpace: Smalltalk }" |
|
4 |
|
5 LimitedPrecisionReal variableByteSubclass:#IEEEFloat |
|
6 instanceVariableNames:'exponentSize' |
|
7 classVariableNames:'' |
|
8 poolDictionaries:'' |
|
9 category:'Magnitude-Numbers' |
|
10 ! |
|
11 |
|
12 !IEEEFloat class methodsFor:'documentation'! |
|
13 |
|
14 documentation |
|
15 " |
|
16 Unfinished, ongoing work |
|
17 |
|
18 soft float emulation for arbitrary IEEE float formats. |
|
19 This is very very slow and should only be used when importing |
|
20 funny sized floating point numbers (such as float24 or float8) from |
|
21 external sources, or to simulate computations on otherwise unsupported floating pnt numbers. |
|
22 " |
|
23 ! ! |
|
24 |
|
25 !IEEEFloat class methodsFor:'instance creation'! |
|
26 |
|
27 size:numBits exponentSize:exponentSize |
|
28 ^ (self basicNew:(numBits // 8)) exponentSize:exponentSize |
|
29 |
|
30 " |
|
31 self size:256 exponentSize:19 |
|
32 " |
|
33 ! |
|
34 |
|
35 size:numBits exponentSize:exponentSize fromFloat:aFloat |
|
36 ^ ((self basicNew:(numBits // 8)) exponentSize:exponentSize) setValueFromFloat:aFloat |
|
37 |
|
38 " |
|
39 self size:256 exponentSize:19 fromFloat:1.0 |
|
40 self size:256 exponentSize:19 fromFloat:2.0 |
|
41 " |
|
42 ! |
|
43 |
|
44 size:numBits exponentSize:exponentSize fromInteger:anInteger |
|
45 ^ ((self basicNew:(numBits // 8)) exponentSize:exponentSize) setValueFromInteger:anInteger |
|
46 |
|
47 " |
|
48 self size:256 exponentSize:19 fromInteger:1 |
|
49 self size:256 exponentSize:19 fromInteger:2 |
|
50 " |
|
51 ! ! |
|
52 |
|
53 !IEEEFloat class methodsFor:'queries'! |
|
54 |
|
55 isAbstract |
|
56 "Return if this class is an abstract class. |
|
57 True is returned here for myself only; false for subclasses. |
|
58 Abstract subclasses must redefine this again." |
|
59 |
|
60 ^ self == IEEEFloat. |
|
61 ! ! |
|
62 |
|
63 !IEEEFloat methodsFor:'accessing'! |
|
64 |
|
65 exponentSize |
|
66 ^ exponentSize |
|
67 ! |
|
68 |
|
69 exponentSize:something |
|
70 exponentSize := something. |
|
71 ! |
|
72 |
|
73 setValueFromInteger:intValue |
|
74 "/ how many bits are there, in this int |
|
75 |absValue myNumBits numBitsInNumber shift| |
|
76 |
|
77 absValue := intValue abs. |
|
78 numBitsInNumber := absValue highBit. |
|
79 myNumBits := (self basicSize * 8) - 1 "sign" - exponentSize. |
|
80 shift := myNumBits - numBitsInNumber. |
|
81 numBitsInNumber > myNumBits ifTrue:[ |
|
82 self halt. |
|
83 ] ifFalse:[ |
|
84 "/ number: |
|
85 "/ 1xxxxxxx...xxxxx |
|
86 "/ myRep: |
|
87 "/ seee...eeexxxxxxxxxx |
|
88 absValue digitLength to:1 by:-1 do:[:byteIndex | |
|
89 |
|
90 ]. |
|
91 ]. |
|
92 |
|
93 "/ cut off some bits |
|
94 |
|
95 "Float numBitsInExponent |
|
96 self size:16 exponentSize:4 fromInteger:1 |
|
97 self size:32 exponentSize:11 fromInteger:1 |
|
98 |
|
99 self size:256 exponentSize:19 fromInteger:1 |
|
100 self size:256 exponentSize:19 fromInteger:2 |
|
101 " |
|
102 ! ! |
|
103 |
|
104 !IEEEFloat class methodsFor:'documentation'! |
|
105 |
|
106 version_CVS |
|
107 ^ '$Header$' |
|
108 ! ! |
|
109 |