Skip to content

Commit b7e9f7f

Browse files
committed
Fix two Decimal members with respect to NaN
1 parent 664c8a0 commit b7e9f7f

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

Foundation/Decimal.swift

+8-8
Original file line numberDiff line numberDiff line change
@@ -202,16 +202,12 @@ extension Decimal {
202202
extension Decimal : Hashable, Comparable {
203203
internal var doubleValue: Double {
204204
if _length == 0 {
205-
if _isNegative == 1 {
206-
return Double.nan
207-
} else {
208-
return 0
209-
}
205+
return _isNegative == 1 ? Double.nan : 0
210206
}
211207

212208
var d = 0.0
213-
for idx in stride(from: min(_length, 8), to: 0, by: -1) {
214-
d = d * 65536 + Double(self[idx - 1])
209+
for idx in (0..<min(_length, 8)).reversed() {
210+
d = d * 65536 + Double(self[idx])
215211
}
216212

217213
if _exponent < 0 {
@@ -336,7 +332,11 @@ extension Decimal : ExpressibleByIntegerLiteral {
336332

337333
extension Decimal : SignedNumeric {
338334
public var magnitude: Decimal {
339-
return Decimal(_exponent: _exponent, _length: _length, _isNegative: 0, _isCompact: _isCompact, _reserved: 0, _mantissa: _mantissa)
335+
guard _length != 0 else { return self }
336+
return Decimal(
337+
_exponent: self._exponent, _length: self._length,
338+
_isNegative: 0, _isCompact: self._isCompact,
339+
_reserved: 0, _mantissa: self._mantissa)
340340
}
341341

342342
// FIXME(integers): implement properly

TestFoundation/TestDecimal.swift

+10
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,16 @@ class TestDecimal: XCTestCase {
375375
XCTAssertEqual(Decimal(68040), Decimal(386).advanced(by: Decimal(67654)))
376376
XCTAssertEqual(Decimal(1.234), abs(Decimal(1.234)))
377377
XCTAssertEqual(Decimal(1.234), abs(Decimal(-1.234)))
378+
XCTAssertEqual((0 as Decimal).magnitude, 0 as Decimal)
379+
XCTAssertEqual((1 as Decimal).magnitude, 1 as Decimal)
380+
XCTAssertEqual((1 as Decimal).magnitude, abs(1 as Decimal))
381+
XCTAssertEqual((1 as Decimal).magnitude, abs(-1 as Decimal))
382+
XCTAssertEqual((-1 as Decimal).magnitude, abs(-1 as Decimal))
383+
XCTAssertEqual((-1 as Decimal).magnitude, abs(1 as Decimal))
384+
XCTAssertEqual(Decimal.leastFiniteMagnitude.magnitude, -Decimal.leastFiniteMagnitude) // A bit of a misnomer.
385+
XCTAssertEqual(Decimal.greatestFiniteMagnitude.magnitude, Decimal.greatestFiniteMagnitude)
386+
XCTAssertTrue(Decimal.nan.magnitude.isNaN)
387+
378388
var a = Decimal(1234)
379389
var result = Decimal(0)
380390
XCTAssertEqual(.noError, NSDecimalMultiplyByPowerOf10(&result, &a, 1, .plain))

0 commit comments

Comments
 (0)