|
|
Comments and Discussions
|
|
 |

|
Your program fails when taking a square root as an argument. For example,
Mehroz.Fraction f1 = new Mehroz.Fraction(Math.Sqrt(2));
will cause an OverflowException. So my suggestion is: allow square roots to be entered. The "ToString" override in the Fraction class could be rewritten to return this (for the above example):
√2
Regards,
Mike
modified 25 Jul '12 - 13:45.
|
|
|
|

|
Got an email from Krzysztof Kniaz[^]. He has written the following NUnit tests to test this. Thanks Knaiz.
using System;
using System.Globalization;
using NUnit.Framework;
using Mehroz;
namespace TestFraction
{
[TestFixture()]
public class TestFraction
{
[Test()]
public void NaN()
{
Fraction frac=new Fraction(); Assert.AreEqual(Fraction.NaN,frac);
Assert.AreEqual(NumberFormatInfo.CurrentInfo.NaNSymbol, frac.ToString());
}
[Test()]
public void OneFifth()
{
Fraction frac = new Fraction(1,5); Assert.AreEqual("1/5", frac.ToString());
}
[Test()]
public void TwentyFive()
{
Fraction frac=new Fraction(25); Assert.AreEqual("25", frac.ToString());
}
[Test()]
public void Zero()
{
Fraction frac = new Fraction(0, 0);
Assert.AreEqual("NaN", frac.ToString());
}
[Test()]
public void OneFourthFromDecimal()
{
Fraction frac = new Fraction(0.25);
Assert.AreEqual("1/4", frac.ToString());
}
[Test()]
public void ThirtySevenFourthsFromDecimal()
{
Fraction frac = new Fraction(9.25);
Assert.AreEqual("37/4", frac.ToString());
}
[Test()]
public void LongMaxValDivbyZero()
{
Fraction frac = new Fraction(1, long.MaxValue);
string compareTo = string.Format("1/{0}", long.MaxValue);
Assert.AreEqual(compareTo, frac.ToString());
}
[Test()]
public void LongMaxVal()
{
Fraction frac = new Fraction(long.MaxValue, 1);
string compareTo = string.Format("{0}", long.MaxValue);
Assert.AreEqual(compareTo,frac.ToString());
}
[Test()]
public void TwoPlusOneIssue()
{
Fraction frac = new Fraction(long.MinValue + 1, 1);
string compareTo = string.Format("{0}", long.MinValue + 1);
Assert.AreEqual(compareTo, frac.ToString());
}
[Test()]
public void LongMaxbyLongMax()
{
Fraction frac = new Fraction(long.MaxValue, long.MaxValue);
Assert.AreEqual("1",frac.ToString());
}
[Test()]
public void LongMinPlusOne()
{
Fraction frac = new Fraction(1, long.MinValue + 1);
string compareTo = string.Format("-1/{0}", Math.Abs(long.MinValue + 1));
Assert.AreEqual(compareTo,frac.ToString());
}
[Test()]
public void LongMinByLongMin()
{
Fraction frac = new Fraction(long.MinValue + 1, long.MinValue + 1);
Assert.AreEqual("1",frac.ToString());
}
[Test()]
public void LongMaxByLongMinMinusOne()
{
Fraction frac=new Fraction(long.MaxValue, long.MinValue + 1);
Assert.AreEqual("-1", frac.ToString());
}
[Test()]
public void LongMinPlusOneByLongMax()
{
Fraction frac = new Fraction(long.MinValue + 1, long.MaxValue);
Assert.AreEqual("-1", frac.ToString());
}
[Test()]
public void OneFourthieth()
{
Fraction frac = new Fraction(0.025); Assert.AreEqual("1/40",frac.ToString());
}
[Test()]
public void HalfFromFractionalTwo()
{
Fraction frac = new Fraction(1 / 2.0); Assert.AreEqual("1/2",frac.ToString() );
}
[Test()]
public void ThirdFromFractionalThree()
{
Fraction frac = new Fraction(1 / 3.0); Assert.AreEqual("1/3", frac.ToString());
}
[Test()]
public void QuarterFromFractionalFour()
{
Fraction frac = new Fraction(1 / 4.0); Assert.AreEqual("1/4",frac.ToString());
}
[Test()]
public void FifthFromFractionalFive()
{
Fraction frac = new Fraction(1 / 5.0); Assert.AreEqual("1/5", frac.ToString());
}
[Test()]
public void SixthFromFractionalSix()
{
Fraction frac = new Fraction(1 / 6.0); Assert.AreEqual("1/6",frac.ToString());
}
[Test()]
public void SeventhFromFractionalSeven()
{
Fraction frac = new Fraction(1 / 7.0); Assert.AreEqual("1/7",frac.ToString());
}
[Test()]
public void EigthFromFractionalEigt()
{
Fraction frac = new Fraction(1 / 8.0); Assert.AreEqual("1/8", frac.ToString());
}
[Test()]
public void NinethFromFractionalNine()
{
Fraction frac = new Fraction(1 / 9.0); Assert.AreEqual("1/9",frac.ToString());
}
[Test()]
public void TenthFromFractionalTen()
{
Fraction frac = new Fraction(1 / 10.0); Assert.AreEqual("1/10",frac.ToString());
}
[Test()]
public void FourthyNinethFromFractional49()
{
Fraction frac = new Fraction(1 / 49.0); Assert.AreEqual("1/49",frac.ToString());
}
[Test()]
public void SixFromIntSix()
{
Fraction frac = new Fraction(6);
Assert.AreEqual("6", frac.ToString() );
}
[Test()]
public void FourFromIntFour()
{
Fraction frac = new Fraction(4);
Assert.AreEqual("4",frac.ToString());
}
[Test()]
public void Modulo2()
{
Fraction frac = new Fraction(6);
Fraction divisor = new Fraction(4);
frac %= divisor;
Assert.AreEqual("2",frac.ToString() );
}
[Test()]
public void FractionalDivision1()
{
Fraction frac = new Fraction(9,4);
Fraction divisor = new Fraction(2);
frac %= divisor;
Assert.AreEqual("1/4",frac.ToString());
}
[Test()]
public void FractionalDivision2()
{
Fraction frac = new Fraction(5, 12);
Fraction divisor = new Fraction(1,4);
frac %= divisor;
Assert.AreEqual("1/6",frac.ToString());
}
[Test()]
public void FromDecimal1()
{
Fraction frac = new Fraction(1.0);
Assert.AreEqual("1",frac.ToString() );
}
[Test()]
public void FromDecimal2()
{
Fraction frac = new Fraction(2.0);
Assert.AreEqual("2",frac.ToString());
}
[Test()]
public void FromDecimalMinus2()
{
Fraction frac = new Fraction(-2.0);
Assert.AreEqual("-2",frac.ToString());
}
[Test()]
public void FromDecimalMinus1()
{
Fraction frac = new Fraction(-1.0);
Assert.AreEqual("-1",frac.ToString() );
}
[Test()]
public void HalfFromDecimal()
{
Fraction frac = new Fraction(0.5);
Assert.AreEqual("1/2",frac.ToString() );
}
[Test()]
public void OneAndHalfFromDecimal()
{
Fraction frac = new Fraction(1.5);
Assert.AreEqual("3/2",frac.ToString());
}
[Test()]
public void LoopCheck()
{
for (int numerator = -100; numerator < 100; numerator++)
{
for (int denominator = -100; denominator < 100; denominator++)
{
Fraction frac1 = new Fraction(numerator, denominator);
double dbl = (double)numerator / (double)denominator;
Fraction frac2 = new Fraction(dbl);
Assert.AreEqual(frac2,frac1);
}
}
}
[Test()]
public void SixandQuarter()
{
Fraction frac = new Fraction("6.25"); Assert.AreEqual("25/4", frac.ToString());
}
[Test()]
public void AssignZero()
{
Fraction frac = new Fraction("0.5");
frac = 0;
Assert.AreEqual("0", frac.ToString() );
}
[Test()]
public void AssignOne()
{
Fraction frac = new Fraction("0.5");
frac = 1;
Assert.AreEqual("1", frac.ToString() );
}
[Test()]
public void PositiveInfinity()
{
Fraction frac = new Fraction("2");
frac /= new Fraction(0);
Assert.AreEqual(Fraction.PositiveInfinity, frac);
}
[Test()]
public void NegativeInfinity()
{
Fraction frac = new Fraction("-1");
frac /= new Fraction(0);
Assert.AreEqual(Fraction.NegativeInfinity, frac);
}
[Test()]
public void Addition()
{
Fraction frac = new Fraction("1/2");
frac += new Fraction(2.5);
Assert.AreEqual("3", frac.ToString());
}
[Test()]
public void Deduction()
{
Fraction frac = new Fraction(0.5);
frac -= new Fraction("1/4");
Assert.AreEqual("1/4", frac.ToString());
}
[Test()]
public void Equation1()
{
Fraction frac = new Fraction("1/2");
Assert.IsFalse(frac.Equals(0.5));
}
[Test()]
public void Equation2()
{
Fraction frac = new Fraction("1/2");
Fraction frac1 = new Fraction(0.5);
bool stmtm = frac==frac1;
Assert.IsTrue(stmtm);
}
[Test()]
public void Multiplication()
{
Fraction frac = new Fraction("1/3");
frac *= 3;
Assert.AreEqual("1", frac.ToString());
}
[Test()]
public void Division()
{
Fraction frac = new Fraction("1/3");
frac /= 15;
Assert.AreEqual("1/45", frac.ToString());
}
[Test()]
public void ImplicitCast1()
{
Fraction frac = new Fraction();
frac = "1/2"; Assert.AreEqual("1/2", frac.ToString());
}
[Test()]
public void ImplicitCast2()
{
Fraction frac = new Fraction();
frac = "22.5"; Assert.AreEqual("45/2", frac.ToString());
}
[Test()]
public void ImplicitCast3()
{
Fraction frac = new Fraction();
frac = 10.25; Assert.AreEqual("41/4", frac.ToString());
}
[Test()]
public void ImplicitCast4()
{
Fraction frac = new Fraction();
frac = 15; Assert.AreEqual("15", frac.ToString());
}
[Test()]
public void DoubleNan()
{
Fraction frac = new Fraction();
frac = double.NaN;
Assert.AreEqual(NumberFormatInfo.CurrentInfo.NaNSymbol,frac.ToString());
}
[Test()]
public void DoublePositiveInfinity()
{
Fraction frac = new Fraction();
frac = double.PositiveInfinity;
Assert.AreEqual(NumberFormatInfo.CurrentInfo.PositiveInfinitySymbol,frac.ToString());
}
[Test()]
public void DoubleNegativeInfinity()
{
Fraction frac = new Fraction();
frac = double.NegativeInfinity;
Assert.AreEqual(NumberFormatInfo.CurrentInfo.NegativeInfinitySymbol, frac.ToString());
}
}
}
Regards,Syed Mehroz Alam
My Blog | My Articles
Computers are incredibly fast, accurate, and stupid; humans are incredibly slow, inaccurate and brilliant; together they are powerful beyond imagination. - Albert Einstein
|
|
|
|

|
anhld
|
|
|
|
|

|
Apart from being an excellent class I'd like to note that the GCD method is done in base 10 arithmatic. It would benefit greatly if done in binary using binary shifts doing the division. I've located a C++ algorithm on wikipedia to do exactly that http://en.wikipedia.org/wiki/Binary_GCD_algorithm[^]
|
|
|
|

|
Hey, I needed a fraction class that would display things like "1 1/2" and such, instead of showing it as 3/2.
A quick change to the ToSting() function provides this. Certainly not the best solution, but it was quick and it does what I needed. Great class all around though.
public override string ToString()
{
if (this.m_Denominator == 1)
{
return this.m_Numerator.ToString();
}
else if (this.m_Denominator == 0)
{
return IndeterminateTypeName(this.m_Numerator);
}
else
{
if (this.m_Numerator > this.m_Denominator)
{
long div = this.m_Numerator / this.m_Denominator;
float rem = (float)this.m_Numerator / (float)this.m_Denominator - (float)div;
return div.ToString() + " " + new Fraction(rem).ToString();
}
else
{
return this.m_Numerator.ToString() + "/" + this.m_Denominator.ToString();
}
}
}
|
|
|
|

|
Okay... that's what I get for posting before thinking. The last version introduced potential rounding problems... but using the following instead solves that.
if (this.m_Numerator > this.m_Denominator)
{
long div = this.m_Numerator / this.m_Denominator;
Fraction rem = new Fraction(this.m_Numerator - (div*this.m_Denominator),this.m_Denominator);
return div.ToString() + " " + rem.ToString();
}
|
|
|
|

|
Why not just encapsulate that method in a different method name?
ToMixedNumber()
|
|
|
|

|
this is a very good class. and i used it in my graduation project but do u have the c++ version or do u know any other jordan gaussian class but in c++
Mina Momtaz
|
|
|
|
|
 |
|
|
General News Suggestion Question Bug Answer Joke Rant Admin
|
An article representing floating point numbers as fractions.
| Type | Article |
| Licence | CPOL |
| First Posted | 16 Dec 2004 |
| Views | 92,691 |
| Bookmarked | 39 times |
|
|