diff --git a/build.vc11/mpir.net/mpir.net-tests/mpir.net-tests.csproj b/build.vc11/mpir.net/mpir.net-tests/mpir.net-tests.csproj
index 8995d327..fea31899 100644
--- a/build.vc11/mpir.net/mpir.net-tests/mpir.net-tests.csproj
+++ b/build.vc11/mpir.net/mpir.net-tests/mpir.net-tests.csproj
@@ -97,6 +97,9 @@
HugeFloatTests\Arithmetic.cs
+
+ HugeFloatTests\Assignment.cs
+
HugeFloatTests\Comparisons.cs
diff --git a/mpir.net/mpir.net-tests/HugeFloatTests/Assignment.cs b/mpir.net/mpir.net-tests/HugeFloatTests/Assignment.cs
index 00665cbd..1fe241d9 100644
--- a/mpir.net/mpir.net-tests/HugeFloatTests/Assignment.cs
+++ b/mpir.net/mpir.net-tests/HugeFloatTests/Assignment.cs
@@ -20,70 +20,81 @@ along with the MPIR Library. If not, see http://www.gnu.org/licenses/.
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
-namespace MPIR.Tests.HugeRationalTests
+namespace MPIR.Tests.HugeFloatTests
{
[TestClass]
public class Assignment
{
[TestMethod]
- public void RationalAssignCopy()
+ public void FloatAssignCopy()
{
- using (var a = new HugeRational("-222509832503450298345029835740293845720/115756986668303657898962467957"))
- using (var b = new HugeRational())
+ var s = "-1.22250983250345029834502983574029384572";
+ using (var a = new HugeFloat(s))
+ using (var b = new HugeFloat())
{
b.Value = a;
- Assert.AreEqual("-222509832503450298345029835740293845720/115756986668303657898962467957", b.ToString());
+ FloatAssert.AreEqual(s, b);
}
}
[TestMethod]
- public void RationalSwap()
+ public void FloatSwap()
{
- using (var a = new HugeRational("-222509832503450298345029835740293845720/115756986668303657898962467957"))
- using (var b = new HugeRational("2039847290878794872059384789347534534/590872612825179551336102196593"))
+ using (var a = new HugeFloat(192))
+ using (var b = new HugeFloat(128))
{
var aValue = a._value();
var bValue = b._value();
+ var aPrec = a._allocatedPrecision;
+ var bPrec = b._allocatedPrecision;
a.Swap(b);
Assert.AreEqual(bValue, a._value());
Assert.AreEqual(aValue, b._value());
+ Assert.AreEqual(bPrec, a._allocatedPrecision);
+ Assert.AreEqual(aPrec, b._allocatedPrecision);
}
}
[TestMethod]
- public void RationalCompoundOperators()
+ public void FloatCompoundOperators()
{
- using (var a = new HugeRational("938475092834705928347523452345/115756986668303657898962467957"))
+ using (var a = new HugeFloat("938475092834705928347523452345.115756986668303657898962467957"))
{
a.Value += 1;
a.Value *= 10;
- Assert.AreEqual("10542320795030095862464859203020/115756986668303657898962467957", a.ToString());
+ FloatAssert.AreEqual("9384750928347059283475234523461.15756986668303657898962467957", a);
}
}
[TestMethod]
- public void RationalAssignInt()
+ public void FloatAssignInt()
{
using (var a = new HugeInt("222509832503450298345029835740293845720"))
- using (var b = new HugeRational("1/3"))
+ using (var b = new HugeFloat())
{
b.SetTo(a);
- Assert.AreEqual("222509832503450298345029835740293845720/1", b.ToString());
+ FloatAssert.AreEqual("222509832503450298345029835740293845720.", b);
}
}
[TestMethod]
- public void RationalAssignInt2()
+ public void FloatAssignDouble()
{
- using (var a = new HugeInt("222509832503450298345029835740293845719"))
- using (var d = new HugeInt("115756986668303657898962467957"))
- using (var b = new HugeRational("1/3"))
+ using(var a = new HugeFloat())
{
- b.SetTo(a, d);
- Assert.AreEqual("222509832503450298345029835740293845719/115756986668303657898962467957", b.ToString());
- b.SetTo(b.Numerator - b.Denominator, b.Denominator * 5);
- Assert.AreEqual(a - d, b.Numerator);
- Assert.AreEqual(d * 5, b.Denominator);
+ a.SetTo(22250983250345.125);
+ Assert.IsTrue(a == 22250983250345.125);
+ }
+ }
+
+ [TestMethod]
+ public void FloatAssignRational()
+ {
+ using (var a = new HugeRational(1, 3))
+ using (var b = new HugeFloat())
+ {
+ b.SetTo(a);
+ FloatAssert.AreEqual(".3333333333333333333333333333333333333333333333333333333333", b);
}
}
//more tests coming here
diff --git a/mpir.net/mpir.net/HugeFloat.cpp b/mpir.net/mpir.net/HugeFloat.cpp
index c57ca194..d32c7ccf 100644
--- a/mpir.net/mpir.net/HugeFloat.cpp
+++ b/mpir.net/mpir.net/HugeFloat.cpp
@@ -19,6 +19,7 @@ along with the MPIR Library. If not, see http://www.gnu.org/licenses/.
#include "Stdafx.h"
#include "HugeInt.h"
+#include "HugeRational.h"
#include "HugeFloat.h"
//#include "Random.h"
diff --git a/mpir.net/mpir.net/HugeFloat.h b/mpir.net/mpir.net/HugeFloat.h
index 8e8962ca..c8480b33 100644
--- a/mpir.net/mpir.net/HugeFloat.h
+++ b/mpir.net/mpir.net/HugeFloat.h
@@ -48,6 +48,7 @@ using namespace System::Runtime::InteropServices;
#define MPEXPR(x) LIT(MPTYPE_NAME)##x##Expression
#define CTXT(x) context.FloatArgs[x]
#define CTXTI(x) context.IntArgs[x]
+#define CTXTR(x) context.RationalArgs[x]
#define ASSIGN_TO CONCAT(AssignTo, LIT(MPTYPE_NAME))
#include "ExpressionMacros.h"
@@ -1042,7 +1043,7 @@ namespace MPIR
void SetTo(String^ value, int base);
///
- /// Sets the value of the raitonal object.
+ /// Sets the value of the float object.
/// Do not change the value of an object while it is contained in a hash table, because that changes its hash code.
///
/// new value for the object
@@ -1053,6 +1054,18 @@ namespace MPIR
MP(set_z)(_value, CTXTI(0));
}
+ ///
+ /// Sets the value of the float object.
+ /// Do not change the value of an object while it is contained in a hash table, because that changes its hash code.
+ ///
+ /// new value for the object
+ void SetTo(RationalExpression^ value)
+ {
+ EvaluationContext context;
+ value->AssignToRational(context);
+ MP(set_q)(_value, CTXTR(0));
+ }
+
///
/// Swaps the values of two floats.
/// This operation is a pointer swap and doesn't affect allocated memory.
@@ -1062,8 +1075,13 @@ namespace MPIR
void Swap(MPTYPE^ a)
{
MP(ptr) temp = a->_value;
+ mp_bitcnt_t prec = a->_allocatedPrecision;
+
a->_value = _value;
+ a->_allocatedPrecision = _allocatedPrecision;
+
_value = temp;
+ _allocatedPrecision = prec;
}
#pragma endregion
diff --git a/mpir.net/mpir.net/HugeRational.h b/mpir.net/mpir.net/HugeRational.h
index 28da9444..0d28c2f5 100644
--- a/mpir.net/mpir.net/HugeRational.h
+++ b/mpir.net/mpir.net/HugeRational.h
@@ -1135,7 +1135,7 @@ namespace MPIR
void SetTo(String^ value, int base);
///
- /// Sets the value of the raitonal object.
+ /// Sets the value of the rational object.
/// Do not change the value of an object while it is contained in a hash table, because that changes its hash code.
///
/// new value for the object
@@ -1146,7 +1146,7 @@ namespace MPIR
}
///
- /// Sets the value of the raitonal object.
+ /// Sets the value of the rational object.
/// Do not change the value of an object while it is contained in a hash table, because that changes its hash code.
/// If the fraction is not in canonical form, Canonicalize() must be called.
///