diff --git a/Foundation/Decimal.swift b/Foundation/Decimal.swift index 175dfcc674..c650f67cc2 100644 --- a/Foundation/Decimal.swift +++ b/Foundation/Decimal.swift @@ -101,7 +101,7 @@ public struct Decimal { extension Decimal { public static let leastFiniteMagnitude = Decimal( - _exponent: 127, + _exponent: Int32(Int8.max), _length: 8, _isNegative: 1, _isCompact: 1, @@ -109,7 +109,7 @@ extension Decimal { _mantissa: (0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff) ) public static let greatestFiniteMagnitude = Decimal( - _exponent: 127, + _exponent: Int32(Int8.max), _length: 8, _isNegative: 0, _isCompact: 1, @@ -117,7 +117,7 @@ extension Decimal { _mantissa: (0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff) ) public static let leastNormalMagnitude = Decimal( - _exponent: -127, + _exponent: Int32(Int8.min), _length: 1, _isNegative: 0, _isCompact: 1, @@ -125,7 +125,7 @@ extension Decimal { _mantissa: (0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000) ) public static let leastNonzeroMagnitude = Decimal( - _exponent: -127, + _exponent: Int32(Int8.min), _length: 1, _isNegative: 0, _isCompact: 1, diff --git a/TestFoundation/TestDecimal.swift b/TestFoundation/TestDecimal.swift index 38acd3d37a..66d1401479 100644 --- a/TestFoundation/TestDecimal.swift +++ b/TestFoundation/TestDecimal.swift @@ -34,6 +34,8 @@ class TestDecimal: XCTestCase { ("test_doubleValue", test_doubleValue), ("test_NSDecimalNumberValues", test_NSDecimalNumberValues), ("test_bridging", test_bridging), + ("test_LeastMagnitude", test_LeastMagnitude), + ("test_GreatestMagnitude", test_GreatestMagnitude), ] } @@ -167,9 +169,9 @@ class TestDecimal: XCTestCase { XCTAssertEqual(smallest, Decimal.leastFiniteMagnitude) let biggest = Decimal(_exponent: 127, _length: 8, _isNegative: 0, _isCompact: 1, _reserved: 0, _mantissa: (UInt16.max, UInt16.max, UInt16.max, UInt16.max, UInt16.max, UInt16.max, UInt16.max, UInt16.max)) XCTAssertEqual(biggest, Decimal.greatestFiniteMagnitude) - let leastNormal = Decimal(_exponent: -127, _length: 1, _isNegative: 0, _isCompact: 1, _reserved: 0, _mantissa: (1, 0, 0, 0, 0, 0, 0, 0)) + let leastNormal = Decimal(_exponent: -128, _length: 1, _isNegative: 0, _isCompact: 1, _reserved: 0, _mantissa: (1, 0, 0, 0, 0, 0, 0, 0)) XCTAssertEqual(leastNormal, Decimal.leastNormalMagnitude) - let leastNonzero = Decimal(_exponent: -127, _length: 1, _isNegative: 0, _isCompact: 1, _reserved: 0, _mantissa: (1, 0, 0, 0, 0, 0, 0, 0)) + let leastNonzero = Decimal(_exponent: -128, _length: 1, _isNegative: 0, _isCompact: 1, _reserved: 0, _mantissa: (1, 0, 0, 0, 0, 0, 0, 0)) XCTAssertEqual(leastNonzero, Decimal.leastNonzeroMagnitude) let pi = Decimal(_exponent: -38, _length: 8, _isNegative: 0, _isCompact: 1, _reserved: 0, _mantissa: (0x6623, 0x7d57, 0x16e7, 0xad0d, 0xaf52, 0x4641, 0xdfa7, 0xec58)) XCTAssertEqual(pi, Decimal.pi) @@ -761,6 +763,23 @@ class TestDecimal: XCTestCase { XCTAssertEqual(1, negativeSix.raising(toPower: 0)) } + func test_LeastMagnitude() { + var result = Decimal() + + var leastNormal = Decimal.leastNormalMagnitude + XCTAssertEqual(.underflow, NSDecimalMultiplyByPowerOf10(&result, &leastNormal, -1, .plain)) + + var leastNonzero = Decimal.leastNonzeroMagnitude + XCTAssertEqual(.underflow, NSDecimalMultiplyByPowerOf10(&result, &leastNonzero, -1, .plain)) + } + + func test_GreatestMagnitude() { + var result = Decimal() + + var greatest = Decimal.greatestFiniteMagnitude + XCTAssertEqual(.overflow, NSDecimalMultiplyByPowerOf10(&result, &greatest, 1, .plain)) + } + func test_doubleValue() { XCTAssertEqual(NSDecimalNumber(decimal:Decimal(0)).doubleValue, 0) XCTAssertEqual(NSDecimalNumber(decimal:Decimal(1)).doubleValue, 1) diff --git a/TestFoundation/TestJSONSerialization.swift b/TestFoundation/TestJSONSerialization.swift index af3cf5d0b3..b03d5a3fec 100644 --- a/TestFoundation/TestJSONSerialization.swift +++ b/TestFoundation/TestJSONSerialization.swift @@ -1301,8 +1301,8 @@ extension TestJSONSerialization { func test_serialize_Decimal() { XCTAssertEqual(try trySerialize([-Decimal.leastFiniteMagnitude]), "[3402823669209384634633746074317682114550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]") XCTAssertEqual(try trySerialize([Decimal.leastFiniteMagnitude]), "[-3402823669209384634633746074317682114550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]") - XCTAssertEqual(try trySerialize([-Decimal.leastNonzeroMagnitude]), "[-0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001]") - XCTAssertEqual(try trySerialize([Decimal.leastNonzeroMagnitude]), "[0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001]") + XCTAssertEqual(try trySerialize([-Decimal.leastNonzeroMagnitude]), "[-0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001]") + XCTAssertEqual(try trySerialize([Decimal.leastNonzeroMagnitude]), "[0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001]") XCTAssertEqual(try trySerialize([-Decimal.greatestFiniteMagnitude]), "[-3402823669209384634633746074317682114550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]") XCTAssertEqual(try trySerialize([Decimal.greatestFiniteMagnitude]), "[3402823669209384634633746074317682114550000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000]") XCTAssertEqual(try trySerialize([Decimal(Int8.min), Decimal(Int8(0)), Decimal(Int8.max)]), "[-128,0,127]")