summaryrefslogtreecommitdiff
path: root/mcs/class/System.Numerics
diff options
context:
space:
mode:
authorJo Shields <directhex@apebox.org>2014-02-19 22:12:43 +0000
committerJo Shields <directhex@apebox.org>2014-02-19 22:12:43 +0000
commit9972bf87b4f27d9c8f358ef8414ac1ab957a2f0f (patch)
tree5bb230c1d698659115f918e243c1d4b0aa4c7f51 /mcs/class/System.Numerics
parentd0a215f5626219ff7927f576588a777e5331c7be (diff)
downloadmono-upstream/3.2.8+dfsg.tar.gz
Imported Upstream version 3.2.8+dfsgupstream/3.2.8+dfsg
Diffstat (limited to 'mcs/class/System.Numerics')
-rw-r--r--mcs/class/System.Numerics/System.Numerics/BigInteger.cs16
-rw-r--r--mcs/class/System.Numerics/System.Numerics/Complex.cs2
-rw-r--r--mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs14
3 files changed, 28 insertions, 4 deletions
diff --git a/mcs/class/System.Numerics/System.Numerics/BigInteger.cs b/mcs/class/System.Numerics/System.Numerics/BigInteger.cs
index 816ca2ffce..a05d403988 100644
--- a/mcs/class/System.Numerics/System.Numerics/BigInteger.cs
+++ b/mcs/class/System.Numerics/System.Numerics/BigInteger.cs
@@ -473,10 +473,20 @@ namespace System.Numerics {
return (((long)high) << 32) | low;
}
- if (high > 0x80000000u)
+ /*
+ We cannot represent negative numbers smaller than long.MinValue.
+ Those values are encoded into what look negative numbers, so negating
+ them produces a positive value, that's why it's safe to check for that
+ condition.
+
+ long.MinValue works fine since it's bigint encoding looks like a negative
+ number, but since long.MinValue == -long.MinValue, we're good.
+ */
+
+ long result = - ((((long)high) << 32) | (long)low);
+ if (result > 0)
throw new OverflowException ();
-
- return - ((((long)high) << 32) | (long)low);
+ return result;
}
[CLSCompliantAttribute (false)]
diff --git a/mcs/class/System.Numerics/System.Numerics/Complex.cs b/mcs/class/System.Numerics/System.Numerics/Complex.cs
index 6c172751b3..89b6bd463a 100644
--- a/mcs/class/System.Numerics/System.Numerics/Complex.cs
+++ b/mcs/class/System.Numerics/System.Numerics/Complex.cs
@@ -231,7 +231,7 @@ namespace System.Numerics {
public static Complex Cosh (Complex value)
{
return new Complex (Math.Cosh (value.real) * Math.Cos (value.imaginary),
- -Math.Sinh (value.real) * Math.Sin (value.imaginary));
+ Math.Sinh (value.real) * Math.Sin (value.imaginary));
}
public static Complex Negate (Complex value)
diff --git a/mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs b/mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs
index 098c50854b..a5ec016bb3 100644
--- a/mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs
+++ b/mcs/class/System.Numerics/Test/System.Numerics/BigIntegerTest.cs
@@ -1145,5 +1145,19 @@ namespace MonoTests.System.Numerics
a = new BigInteger ();
Assert.AreEqual (BigInteger.Zero.GetHashCode (), a.GetHashCode (), "#15");
}
+
+ [Test]
+ public void Bug16526 ()
+ {
+ var x = BigInteger.Pow(2, 63);
+ x *= -1;
+ x -= 1;
+ Assert.AreEqual ("-9223372036854775809", x.ToString (), "#1");
+ try {
+ x = (long)x;
+ Assert.Fail ("#2 Must OVF");
+ } catch (OverflowException) {
+ }
+ }
}
}