diff --git a/mpir.net/mpir.net/ExpressionMacros.h b/mpir.net/mpir.net/ExpressionMacros.h index 681cfa9c..5119f1b2 100644 --- a/mpir.net/mpir.net/ExpressionMacros.h +++ b/mpir.net/mpir.net/ExpressionMacros.h @@ -272,6 +272,15 @@ private ref class MPEXPR(name) : base negativeOp(destination, destination, (mpir_ui)-Right); \ } +#define DEFINE_BINARY_ASSIGNMENT_REF_SI2(name, leftTypeAbbr, rightTypeAbbr, operation, negateOp) \ + DEFINE_ASSIGNMENT_PROLOG(name##leftTypeAbbr##rightTypeAbbr) \ + { \ + Left->AssignTo(destination); \ + operation(destination, destination, (Right >= 0) ? (mpir_ui)Right : (mpir_ui)-Right); \ + if (Right < 0) \ + negateOp(destination, destination); \ + } + #define DEFINE_BINARY_ASSIGNMENT_SI_REF(name, leftTypeAbbr, rightTypeAbbr, positiveOp, negativeOp1, negativeOp2) \ DEFINE_ASSIGNMENT_PROLOG(name##leftTypeAbbr##rightTypeAbbr) \ { \ @@ -285,6 +294,19 @@ private ref class MPEXPR(name) : base } \ } +#define DEFINE_BINARY_ASSIGNMENT_SI_REF2(name, leftTypeAbbr, rightTypeAbbr, positiveOp, negativeOp1, negativeOp2) \ + DEFINE_ASSIGNMENT_PROLOG(name##leftTypeAbbr##rightTypeAbbr) \ + { \ + Right->AssignTo(destination); \ + if (Left >= 0) \ + positiveOp(destination, (mpir_ui)Left, destination); \ + else \ + { \ + negativeOp1(destination, (mpir_ui)-Left, destination); \ + negativeOp2(destination, destination); \ + } \ + } + #define DEFINE_TERNARY_ASSIGNMENT_REF_REF_REF(name, typeAbbr, operation) \ DEFINE_ASSIGNMENT_PROLOG(name##typeAbbr##typeAbbr##typeAbbr) \ { \ diff --git a/mpir.net/mpir.net/HugeFloat.cpp b/mpir.net/mpir.net/HugeFloat.cpp index 2382e45a..1c3fedf8 100644 --- a/mpir.net/mpir.net/HugeFloat.cpp +++ b/mpir.net/mpir.net/HugeFloat.cpp @@ -247,24 +247,24 @@ return result->ToString(); DEFINE_UNARY_ASSIGNMENT_REF(Abs, Flt, MP(abs)) DEFINE_BINARY_ASSIGNMENT_REF_REF(Add, Flt, MP(add)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Add, Flt, Ui, MP(add)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Add, Flt, Si, MP(add)) + DEFINE_BINARY_ASSIGNMENT_REF_VAL(Add, Flt, Ui, MP(add_ui)) + DEFINE_BINARY_ASSIGNMENT_REF_SI (Add, Flt, Si, MP(add_ui), MP(sub_ui)) DEFINE_BINARY_ASSIGNMENT_REF_REF(Subtract, Flt, MP(sub)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Subtract, Flt, Ui, MP(sub)) - DEFINE_BINARY_ASSIGNMENT_RATVAL_REF(Subtract, Ui, Flt, MP(sub)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Subtract, Flt, Si, MP(sub)) - DEFINE_BINARY_ASSIGNMENT_RATVAL_REF(Subtract, Si, Flt, MP(sub)) + DEFINE_BINARY_ASSIGNMENT_REF_VAL(Subtract, Flt, Ui, MP(sub_ui)) + DEFINE_BINARY_ASSIGNMENT_VAL_REF(Subtract, Ui, Flt, MP(ui_sub)) + DEFINE_BINARY_ASSIGNMENT_REF_SI (Subtract, Flt, Si, MP(sub_ui), MP(add_ui)) + DEFINE_BINARY_ASSIGNMENT_SI_REF (Subtract, Si, Flt, MP(ui_sub), MP(add_ui), MP(neg)) DEFINE_BINARY_ASSIGNMENT_REF_REF(Multiply, Flt, MP(mul)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Multiply, Flt, Ui, MP(mul)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Multiply, Flt, Si, MP(mul)) + DEFINE_BINARY_ASSIGNMENT_REF_VAL(Multiply, Flt, Ui, MP(mul_ui)) + DEFINE_BINARY_ASSIGNMENT_REF_SI2(Multiply, Flt, Si, MP(mul_ui), MP(neg)) DEFINE_BINARY_ASSIGNMENT_REF_REF(Divide, Flt, MP(div)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Divide, Flt, Ui, MP(div)) - DEFINE_BINARY_ASSIGNMENT_RATVAL_REF(Divide, Ui, Flt, MP(div)) - DEFINE_BINARY_ASSIGNMENT_REF_RATVAL(Divide, Flt, Si, MP(div)) - DEFINE_BINARY_ASSIGNMENT_RATVAL_REF(Divide, Si, Flt, MP(div)) + DEFINE_BINARY_ASSIGNMENT_REF_VAL(Divide, Flt, Ui, MP(div_ui)) + DEFINE_BINARY_ASSIGNMENT_VAL_REF(Divide, Ui, Flt, MP(ui_div)) + DEFINE_BINARY_ASSIGNMENT_REF_SI2(Divide, Flt, Si, MP(div_ui), MP(neg)) + DEFINE_BINARY_ASSIGNMENT_SI_REF2(Divide, Si, Flt, MP(ui_div), MP(ui_div), MP(neg)) DEFINE_BINARY_ASSIGNMENT_REF_VAL(ShiftLeft, Flt, Bits, MP(mul_2exp)) DEFINE_BINARY_ASSIGNMENT_REF_VAL(ShiftRight, Flt, Bits, MP(div_2exp)) @@ -279,28 +279,12 @@ return result->ToString(); size_t MPTYPE::Write(Stream^ stream) { - auto writtenNumerator = Numerator->Write(stream); - if(writtenNumerator == 0) - return 0; - - auto writtenDenominator = Denominator->Write(stream); - if(writtenDenominator == 0) - return 0; - - return writtenNumerator + writtenDenominator; + throw gcnew NotImplementedException(); } size_t MPTYPE::Read(Stream^ stream) { - auto readNumerator = Numerator->Read(stream); - if(readNumerator == 0) - return 0; - - auto readDenominator = Denominator->Read(stream); - if(readDenominator == 0) - return 0; - - return readNumerator + readDenominator; + throw gcnew NotImplementedException(); } size_t MPTYPE::Write(TextWriter^ writer, int base, bool lowercase) @@ -312,21 +296,7 @@ return result->ToString(); size_t MPTYPE::Read(TextReader^ reader, int base) { - auto readNumerator = Numerator->Read(reader, base); - if(readNumerator == 0) - return 0; - - size_t readDenominator = 0; - char c = reader->Peek(); - if (c == '/') - { - reader->Read(); - readDenominator = 1 + Denominator->Read(reader, base); - if(readDenominator == 1) - return 0; - } - - return readNumerator + readDenominator; + throw gcnew NotImplementedException(); } #pragma endregion diff --git a/mpir.net/mpir.net/HugeFloat.h b/mpir.net/mpir.net/HugeFloat.h index e18f02bc..785e8b18 100644 --- a/mpir.net/mpir.net/HugeFloat.h +++ b/mpir.net/mpir.net/HugeFloat.h @@ -359,7 +359,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (MPEXPR_NAME^ a, MPEXPR_NAME^ b) { return IS_NULL(a) ? IS_NULL(b) : a->Equals(b); } + static bool operator == (MPEXPR_NAME^ a, MPEXPR_NAME^ b) { return IS_NULL(a) ? IS_NULL(b) : a->CompareTo(b) == 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -367,7 +367,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (MPEXPR_NAME^ a, MPEXPR_NAME^ b) { return IS_NULL(a) ? !IS_NULL(b) : !a->Equals(b); } + static bool operator != (MPEXPR_NAME^ a, MPEXPR_NAME^ b) { return IS_NULL(a) ? !IS_NULL(b) : a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -423,7 +423,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (MPEXPR_NAME^ a, mpir_ui b) { return IS_NULL(a) || !a->Equals(b); } + static bool operator != (MPEXPR_NAME^ a, mpir_ui b) { return IS_NULL(a) || a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -431,7 +431,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (MPEXPR_NAME^ a, mpir_ui b) { return !IS_NULL(a) && a->Equals(b); } + static bool operator == (MPEXPR_NAME^ a, mpir_ui b) { return !IS_NULL(a) && a->CompareTo(b) == 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -471,7 +471,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (mpir_ui b, MPEXPR_NAME^ a) { return IS_NULL(a) || !a->Equals(b); } + static bool operator != (mpir_ui b, MPEXPR_NAME^ a) { return IS_NULL(a) || a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -479,7 +479,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (mpir_ui b, MPEXPR_NAME^ a) { return !IS_NULL(a) && a->Equals(b); } + static bool operator == (mpir_ui b, MPEXPR_NAME^ a) { return !IS_NULL(a) && a->CompareTo(b) == 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -519,7 +519,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (MPEXPR_NAME^ a, mpir_si b) { return IS_NULL(a) || !a->Equals(b); } + static bool operator != (MPEXPR_NAME^ a, mpir_si b) { return IS_NULL(a) || a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -527,7 +527,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (MPEXPR_NAME^ a, mpir_si b) { return !IS_NULL(a) && a->Equals(b); } + static bool operator == (MPEXPR_NAME^ a, mpir_si b) { return !IS_NULL(a) && a->CompareTo(b) == 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -567,7 +567,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (mpir_si b, MPEXPR_NAME^ a) { return IS_NULL(a) || !a->Equals(b); } + static bool operator != (mpir_si b, MPEXPR_NAME^ a) { return IS_NULL(a) || a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -575,7 +575,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (mpir_si b, MPEXPR_NAME^ a) { return !IS_NULL(a) && a->Equals(b); } + static bool operator == (mpir_si b, MPEXPR_NAME^ a) { return !IS_NULL(a) && a->CompareTo(b) == 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -615,7 +615,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (MPEXPR_NAME^ a, double b) { return IS_NULL(a) || !a->Equals(b); } + static bool operator != (MPEXPR_NAME^ a, double b) { return IS_NULL(a) || a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -623,7 +623,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (MPEXPR_NAME^ a, double b) { return !IS_NULL(a) && a->Equals(b); } + static bool operator == (MPEXPR_NAME^ a, double b) { return !IS_NULL(a) && a->CompareTo(b) == 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -663,7 +663,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator != (double b, MPEXPR_NAME^ a) { return IS_NULL(a) || !a->Equals(b); } + static bool operator != (double b, MPEXPR_NAME^ a) { return IS_NULL(a) || a->CompareTo(b) != 0; } /// Compares two numbers. /// If any argument is an expression, it is evaluated into a temporary variable before the comparison is performed. @@ -671,7 +671,7 @@ namespace MPIR /// Source value to compare /// Source value to compare with /// A boolean result of the comparison. - static bool operator == (double b, MPEXPR_NAME^ a) { return !IS_NULL(a) && a->Equals(b); } + static bool operator == (double b, MPEXPR_NAME^ a) { return !IS_NULL(a) && a->CompareTo(b) == 0; } /// Calculates the sign (+1, 0, or -1) of the source value. /// If the source is an expression, it is evaluated into a temporary variable before the sign is computed.