@@ -657,20 +657,20 @@ final class DecimalTests : XCTestCase {
657657 // Positive base
658658 let six = Decimal ( 6 )
659659 for exponent in 1 ..< 10 {
660- result = try six. _power ( exponent: UInt ( exponent) , roundingMode: . plain)
660+ result = try six. _power ( exponent: exponent, roundingMode: . plain)
661661 XCTAssertEqual ( result. doubleValue, pow ( 6.0 , Double ( exponent) ) )
662662 }
663663 // Negative base
664664 let negativeSix = Decimal ( - 6 )
665665 for exponent in 1 ..< 10 {
666- result = try negativeSix. _power ( exponent: UInt ( exponent) , roundingMode: . plain)
666+ result = try negativeSix. _power ( exponent: exponent, roundingMode: . plain)
667667 XCTAssertEqual ( result. doubleValue, pow ( - 6.0 , Double ( exponent) ) )
668668 }
669669 for i in - 2 ... 10 {
670670 for j in 0 ... 5 {
671671 let actual = Decimal ( i)
672672 let result = try actual. _power (
673- exponent: UInt ( j ) , roundingMode: . plain
673+ exponent: j , roundingMode: . plain
674674 )
675675 let expected = Decimal ( pow ( Double ( i) , Double ( j) ) )
676676 XCTAssertEqual ( expected, result, " \( result) == \( i) ^ \( j) " )
@@ -1008,10 +1008,10 @@ final class DecimalTests : XCTestCase {
10081008 for i in - 2 ... 10 {
10091009 for j in 0 ... 5 {
10101010 let power = Decimal ( i)
1011- let actual = try power. _power ( exponent: UInt ( j ) , roundingMode: . plain)
1011+ let actual = try power. _power ( exponent: j , roundingMode: . plain)
10121012 let expected = Decimal ( pow ( Double ( i) , Double ( j) ) )
10131013 XCTAssertEqual ( expected, actual, " \( actual) == \( i) ^ \( j) " )
1014- XCTAssertEqual ( expected, try power. _power ( exponent: UInt ( j ) , roundingMode: . plain) )
1014+ XCTAssertEqual ( expected, try power. _power ( exponent: j , roundingMode: . plain) )
10151015 }
10161016 }
10171017
@@ -1301,4 +1301,40 @@ final class DecimalTests : XCTestCase {
13011301 XCTAssertEqual ( length, 3 )
13021302 }
13031303 #endif
1304+
1305+ func testNegativePower( ) {
1306+ func test( withBase base: Decimal , power: Int ) {
1307+ XCTAssertEqual (
1308+ try base. _power ( exponent: - power, roundingMode: . plain) ,
1309+ try Decimal ( 1 ) / base. _power ( exponent: power, roundingMode: . plain) ,
1310+ " Base: \( base) , Power: \( power) "
1311+ )
1312+ }
1313+ // Negative Exponent Rule
1314+ // x^-n = 1/(x^n)
1315+ for power in 2 ..< 10 {
1316+ // Positive Integer base
1317+ test ( withBase: Decimal ( Int . random ( in: 1 ..< 10 ) ) , power: power)
1318+
1319+ // Negative Integer base
1320+ test ( withBase: Decimal ( Int . random ( in: - 10 ..< - 1 ) ) , power: power)
1321+
1322+ // Postive Double base
1323+ test ( withBase: Decimal ( Double . random ( in: 0 ..< 1.0 ) ) , power: power)
1324+
1325+ // Negative Double base
1326+ test ( withBase: Decimal ( Double . random ( in: - 1.0 ..< 0.0 ) ) , power: power)
1327+
1328+ // For zero base: 0^n = 0; 0^(-n) = nan
1329+ XCTAssertEqual (
1330+ try Decimal ( 0 ) . _power ( exponent: power, roundingMode: . plain) ,
1331+ Decimal ( 0 )
1332+ )
1333+ XCTAssertEqual (
1334+ try Decimal ( 0 ) . _power ( exponent: - power, roundingMode: . plain) ,
1335+ Decimal . nan
1336+ )
1337+ }
1338+
1339+ }
13041340}
0 commit comments