From cd25b5b35c62b82a5075b3fe0eb4d84ad1a4e5b3 Mon Sep 17 00:00:00 2001 From: Alex Dyachenko Date: Fri, 27 Jun 2014 10:54:19 -0400 Subject: [PATCH] Float size checks. Three broken tests due to MPIR behavior, bug logged --- .../HugeFloatTests/Conversions.cs | 158 ++++++++++++++++++ mpir.net/mpir.net/HugeFloat.h | 36 ++++ 2 files changed, 194 insertions(+) diff --git a/mpir.net/mpir.net-tests/HugeFloatTests/Conversions.cs b/mpir.net/mpir.net-tests/HugeFloatTests/Conversions.cs index fdbd41a8..b1ea338e 100644 --- a/mpir.net/mpir.net-tests/HugeFloatTests/Conversions.cs +++ b/mpir.net/mpir.net-tests/HugeFloatTests/Conversions.cs @@ -26,6 +26,14 @@ namespace MPIR.Tests.HugeFloatTests [TestClass] public class Conversions { + private static HugeFloat AlmostOne; + + [ClassInitialize] + public static void Init(TestContext context) + { + AlmostOne = new HugeFloat(0.99999); + } + [TestMethod] public void FloatToStringDecimal() { @@ -200,5 +208,155 @@ namespace MPIR.Tests.HugeFloatTests } } } + + [TestMethod] + public void FloatFitsLong() + { + using (var a = new HugeFloat(long.MaxValue)) + using (var b = new HugeFloat()) + { + Assert.IsTrue(a.FitsLong()); + + b.Value = a + AlmostOne; + Assert.IsTrue(b.FitsLong()); + + b.Value = a + 1; + Assert.IsFalse(b.FitsLong()); + + a.SetTo(long.MinValue); + Assert.IsTrue(a.FitsLong()); + + b.Value = a - AlmostOne; + Assert.IsTrue(b.FitsLong()); + + b.Value = a - 1; + Assert.IsFalse(b.FitsLong()); + } + } + + [TestMethod] + public void FloatFitsUlong() + { + using(var a = new HugeFloat(ulong.MaxValue)) + using(var b = new HugeFloat()) + { + Assert.IsTrue(a.FitsUlong()); + + b.Value = a + AlmostOne; + Assert.IsTrue(b.FitsUlong()); + + b.Value = a + 1; + Assert.IsFalse(b.FitsUlong()); + + a.SetTo(ulong.MinValue); + Assert.IsTrue(a.FitsUlong()); + + b.Value = a - AlmostOne; + Assert.IsTrue(b.FitsUlong()); + + b.Value = a - 1; + Assert.IsFalse(b.FitsUlong()); + } + } + + [TestMethod] + public void FloatFitsInt() + { + using(var a = new HugeFloat(int.MaxValue)) + using(var b = new HugeFloat()) + { + Assert.IsTrue(a.FitsInt()); + + b.Value = a + AlmostOne; + Assert.IsTrue(b.FitsInt()); + + b.Value = a + 1; + Assert.IsFalse(b.FitsInt()); + + a.SetTo(int.MinValue); + Assert.IsTrue(a.FitsInt()); + + b.Value = a - AlmostOne; + Assert.IsTrue(b.FitsInt()); + + b.Value = a - 1; + Assert.IsFalse(b.FitsInt()); + } + } + + [TestMethod] + public void FloatFitsUint() + { + using(var a = new HugeFloat(uint.MaxValue)) + using(var b = new HugeFloat()) + { + Assert.IsTrue(a.FitsUint()); + + b.Value = a + AlmostOne; + Assert.IsTrue(b.FitsUint()); + + b.Value = a + 1; + Assert.IsFalse(b.FitsUint()); + + a.SetTo(uint.MinValue); + Assert.IsTrue(a.FitsUint()); + + b.Value = a - AlmostOne; + Assert.IsTrue(b.FitsUint()); + + b.Value = a - 1; + Assert.IsFalse(b.FitsUint()); + } + } + + [TestMethod] + public void FloatFitsShort() + { + using(var a = new HugeFloat(short.MaxValue)) + using(var b = new HugeFloat()) + { + Assert.IsTrue(a.FitsShort()); + + b.Value = a + AlmostOne; + Assert.IsTrue(b.FitsShort()); + + b.Value = a + 1; + Assert.IsFalse(b.FitsShort()); + + a.SetTo(short.MinValue); + Assert.IsTrue(a.FitsShort()); + + b.Value = a - AlmostOne; + Assert.IsTrue(b.FitsShort()); + + b.Value = a - 1; + Assert.IsFalse(b.FitsShort()); + } + } + + [TestMethod] + public void FloatFitsUshort() + { + using(var a = new HugeFloat(ushort.MaxValue)) + using(var b = new HugeFloat()) + { + Assert.IsTrue(a.FitsUshort()); + + b.Value = a + AlmostOne; + Assert.IsTrue(b.FitsUshort()); + + b.Value = a + 1; + Assert.IsFalse(b.FitsUshort()); + + a.SetTo(ushort.MinValue); + Assert.IsTrue(a.FitsUshort()); + + b.Value = a - AlmostOne; + Assert.IsTrue(b.FitsUshort()); + + b.Value = a - 1; + Assert.IsFalse(b.FitsUshort()); + } + } } } diff --git a/mpir.net/mpir.net/HugeFloat.h b/mpir.net/mpir.net/HugeFloat.h index d703b314..0611a009 100644 --- a/mpir.net/mpir.net/HugeFloat.h +++ b/mpir.net/mpir.net/HugeFloat.h @@ -1187,6 +1187,42 @@ namespace MPIR _allocatedPrecision = precision; } + /// + /// Returns true if the value of the source number, if truncated to an integer, is in the long range. + /// + /// true if the value will fit in a long + bool FitsLong() { return MP(fits_si_p)(_value) != 0; } + + /// + /// Returns true if the value of the source number, if truncated to an integer, is in the ulong range. + /// + /// true if the value will fit in a long + bool FitsUlong() { return MP(fits_ui_p)(_value) != 0; } + + /// + /// Returns true if the value of the source number, if truncated to an integer, is in the int range. + /// + /// true if the value will fit in an int + bool FitsInt() { return MP(fits_sint_p)(_value) != 0; } + + /// + /// Returns true if the value of the source number, if truncated to an integer, is in the uint range. + /// + /// true if the value will fit in an int + bool FitsUint() { return MP(fits_uint_p)(_value) != 0; } + + /// + /// Returns true if the value of the source number, if truncated to an integer, is in the short range. + /// + /// true if the value will fit in a short + bool FitsShort() { return MP(fits_sshort_p)(_value) != 0; } + + /// + /// Returns true if the value of the source number, if truncated to an integer, is in the ushort range. + /// + /// true if the value will fit in a short + bool FitsUshort() { return MP(fits_ushort_p)(_value) != 0; } + #pragma endregion #pragma region IO