Implements remainder and exponent operators

This commit is contained in:
2018-12-07 15:29:46 +01:00
parent f504a8706e
commit 9bd82174f2
6 changed files with 71 additions and 13 deletions

View File

@@ -1,3 +1,5 @@
using System;
namespace Upsilon.BaseTypes.Number
{
internal abstract class ScriptNumber : ScriptType
@@ -41,6 +43,17 @@ namespace Upsilon.BaseTypes.Number
return new ScriptNumberDouble(((ScriptNumberLong) a).Value * ((ScriptNumberDouble) b).Value);
}
public static ScriptNumber operator % (ScriptNumber a, ScriptNumber b)
{
if (!a.IsFloat && !b.IsFloat)
return new ScriptNumberLong(((ScriptNumberLong) a).Value % ((ScriptNumberLong) b).Value);
if (a.IsFloat && b.IsFloat)
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value % ((ScriptNumberDouble) b).Value);
if (a.IsFloat)
return new ScriptNumberDouble(((ScriptNumberDouble) a).Value % ((ScriptNumberLong) b).Value);
return new ScriptNumberDouble(((ScriptNumberLong) a).Value % ((ScriptNumberDouble) b).Value);
}
public static ScriptNumber operator / (ScriptNumber a, ScriptNumber b)
{
if (!a.IsFloat && !b.IsFloat)
@@ -60,6 +73,18 @@ namespace Upsilon.BaseTypes.Number
return new ScriptNumberLong(-((ScriptNumberLong)n).Value);
}
public static ScriptNumber Exponent(ScriptNumber a, ScriptNumber b)
{
if (!a.IsFloat && !b.IsFloat)
return new ScriptNumberLong((long) Math.Pow(((ScriptNumberLong) a).Value, ((ScriptNumberLong) b).Value));
if (a.IsFloat && b.IsFloat)
return new ScriptNumberDouble(Math.Pow(((ScriptNumberDouble) a).Value, ((ScriptNumberDouble) b).Value));
if (a.IsFloat)
return new ScriptNumberDouble(Math.Pow(((ScriptNumberDouble) a).Value, ((ScriptNumberLong) b).Value));
return new ScriptNumberDouble(Math.Pow(((ScriptNumberLong) a).Value, ((ScriptNumberDouble) b).Value));
}
#region Equality
private bool Equals(ScriptNumber other)
@@ -117,6 +142,7 @@ namespace Upsilon.BaseTypes.Number
public static explicit operator double(ScriptNumber n)
{
if (n.IsFloat)