diff --git a/QuadrupleLib.Tests/Math/PowerAndRootTests.cs b/QuadrupleLib.Tests/Math/PowerAndRootTests.cs index 7742107..a798632 100644 --- a/QuadrupleLib.Tests/Math/PowerAndRootTests.cs +++ b/QuadrupleLib.Tests/Math/PowerAndRootTests.cs @@ -39,6 +39,9 @@ public void IsSqrtCorrect(double x) [InlineData(1.0)] [InlineData(2.1)] [InlineData(3.676)] + [InlineData(-1.0)] + [InlineData(-2.1)] + [InlineData(-3.676)] public void IsCbrtCorrect(double x) { double y = double.Cbrt(x); @@ -52,6 +55,9 @@ public void IsCbrtCorrect(double x) [InlineData(1.0, 3)] [InlineData(2.1, 3)] [InlineData(3.676, 3)] + [InlineData(-1.0, 3)] + [InlineData(-2.1, 3)] + [InlineData(-3.676, 3)] [InlineData(1.0, 4)] [InlineData(2.1, 4)] [InlineData(3.676, 4)] @@ -68,13 +74,19 @@ public void IsRootNCorrect(double x, int n) [InlineData(1.0, 3)] [InlineData(2.1, 3)] [InlineData(3.676, 3)] + [InlineData(-1.0, 3)] + [InlineData(-2.1, 3)] + [InlineData(-3.676, 3)] [InlineData(1.0, 4)] [InlineData(2.1, 4)] [InlineData(3.676, 4)] public void IsRootNEqualToPow(double x, int n) { Float128 y0 = Float128.RootN(x, n); - Float128 y1 = Float128.Pow(x, Float128.One / n); + Float128 y1 = Float128.Pow( + Float128.Abs(x), Float128.One / n + ); + if (x < 0.0) y1 = -y1; AssertX.NearlyEqual(y0, y1, Precision.NearestTenThousandth); } diff --git a/QuadrupleLib/Modules/MathOperations.cs b/QuadrupleLib/Modules/MathOperations.cs index 65dfefc..c7c1a21 100644 --- a/QuadrupleLib/Modules/MathOperations.cs +++ b/QuadrupleLib/Modules/MathOperations.cs @@ -560,7 +560,7 @@ public static Float128 Exp2(Float128 y) public static Float128 Pow(Float128 x, Float128 y) { - if (IsZero(x) && IsZero(y)) + if (IsZero(x) && IsZero(y)) { return _sNaN; } @@ -574,7 +574,7 @@ public static Float128 Pow(Float128 x, Float128 RootN(Float128 x, int n) } else if (x < Zero) { - return (n & 1) == 0 ? _sNaN : -Pow(-x, n); + return (n & 1) == 0 ? _sNaN : -Pow(-x, One / n); } else {