EvilNumber EvilNumber::_Divide( const EvilNumber & val1, const EvilNumber & val2 ) { EvilNumber result; // WARNING! There should be NO implicit or explicit use of the 'this' pointer here! if (val2.mType == val1.mType) { if (val1.mType == evil_number_float) { result.mValue.fVal = val1.mValue.fVal / val2.mValue.fVal; result.mType = evil_number_float; } else if (val1.mType == evil_number_int) { // make sure we can do things like 2 / 4 = 0.5f result.mValue.fVal = double(val1.mValue.iVal) / double(val2.mValue.iVal); result.mType = evil_number_float; // check if its possibly an integer result.CheckIntegrity(); } } else { // we assume that the val1 argument type is the opposite of the val2 argument type if (val1.mType == evil_number_float) { result.mValue.fVal = val1.mValue.fVal / double(val2.mValue.iVal); result.mType = evil_number_float; } else if (val1.mType == evil_number_int) { double tVal = (double)val1.mValue.iVal; // normal integer number result.mValue.fVal = tVal / val2.mValue.fVal; result.mType = evil_number_float; } else { assert(false); // crash } // check if we are an integer result.CheckIntegrity(); } return result; }
EvilNumber EvilNumber::_Modulus( const EvilNumber & val1, const EvilNumber & val2 ) { EvilNumber result; // WARNING! There should be NO implicit or explicit use of the 'this' pointer here! if (val2.mType == val1.mType) { if (val1.mType == evil_number_float) { result.mValue.iVal = (int64)(val1.mValue.fVal) % (int64)(val2.mValue.fVal); result.mType = evil_number_int; } else if (val1.mType == evil_number_int) { result.mValue.iVal = val1.mValue.iVal % val2.mValue.iVal; result.mType = evil_number_int; } } else { // we assume that the val1 argument type is the opposite of the val2 argument type if (val1.mType == evil_number_float) { result.mValue.iVal = (int64)(val1.mValue.fVal) % val2.mValue.iVal; result.mType = evil_number_int; } else if (val1.mType == evil_number_int) { result.mValue.iVal = val1.mValue.iVal % (int64)(val2.mValue.fVal); result.mType = evil_number_int; } else { assert(false); // crash } // check if we are a integer result.CheckIntegrity(); } return result; }
EvilNumber EvilNumber::_Subtract( const EvilNumber & val1, const EvilNumber & val2 ) { EvilNumber result; // WARNING! There should be NO implicit or explicit use of the 'this' pointer here! if (val2.mType == val1.mType) { if (val1.mType == evil_number_float) { result.mValue.fVal = val1.mValue.fVal - val2.mValue.fVal; result.mType = evil_number_float; } else if (val1.mType == evil_number_int) { result.mValue.iVal = val1.mValue.iVal - val2.mValue.iVal; result.mType = evil_number_int; } } else { // we assume that the val argument is the opposite of the 'this' type if (val1.mType == evil_number_float) { result.mValue.fVal = val1.mValue.fVal - double(val2.mValue.iVal); result.mType = evil_number_float; } else if (val1.mType == evil_number_int) { double tVal = (double)val1.mValue.iVal; // normal integer number result.mValue.fVal = tVal - val2.mValue.fVal; result.mType = evil_number_float; } else { assert(false); // crash } // check if we are a integer result.CheckIntegrity(); } return result; }