@@ -150,21 +150,32 @@ public func pow(_ x: Decimal, _ y: Int) -> Decimal {
150
150
}
151
151
152
152
extension Decimal : Hashable , Comparable {
153
- internal var doubleValue : Double {
153
+ private subscript( index: UInt32 ) -> UInt16 {
154
+ get {
155
+ switch index {
156
+ case 0 : return _mantissa. 0
157
+ case 1 : return _mantissa. 1
158
+ case 2 : return _mantissa. 2
159
+ case 3 : return _mantissa. 3
160
+ case 4 : return _mantissa. 4
161
+ case 5 : return _mantissa. 5
162
+ case 6 : return _mantissa. 6
163
+ case 7 : return _mantissa. 7
164
+ default : fatalError ( " Invalid index \( index) for _mantissa " )
165
+ }
166
+ }
167
+ }
168
+
169
+ internal var doubleValue : Double {
170
+ if _length == 0 {
171
+ return _isNegative == 1 ? Double . nan : 0
172
+ }
173
+
154
174
var d = 0.0
155
- if _length == 0 && _isNegative == 0 {
156
- return Double . nan
175
+ for idx in ( 0 ..< min ( _length , 8 ) ) . reversed ( ) {
176
+ d = d * 65536 + Double( self [ idx ] )
157
177
}
158
178
159
- d = d * 65536 + Double( _mantissa. 7 )
160
- d = d * 65536 + Double( _mantissa. 6 )
161
- d = d * 65536 + Double( _mantissa. 5 )
162
- d = d * 65536 + Double( _mantissa. 4 )
163
- d = d * 65536 + Double( _mantissa. 3 )
164
- d = d * 65536 + Double( _mantissa. 2 )
165
- d = d * 65536 + Double( _mantissa. 1 )
166
- d = d * 65536 + Double( _mantissa. 0 )
167
-
168
179
if _exponent < 0 {
169
180
for _ in _exponent..< 0 {
170
181
d /= 10.0
@@ -212,6 +223,7 @@ extension Decimal : ExpressibleByIntegerLiteral {
212
223
213
224
extension Decimal : SignedNumeric {
214
225
public var magnitude : Decimal {
226
+ guard _length != 0 else { return self }
215
227
return Decimal (
216
228
_exponent: self . _exponent, _length: self . _length,
217
229
_isNegative: 0 , _isCompact: self . _isCompact,
0 commit comments