diff -ur kcalc-4.9.90/kcalc_core.cpp kcalc-4.9.90-misc/kcalc_core.cpp --- kcalc-4.9.90/kcalc_core.cpp 2012-11-14 17:46:47.000000000 +0100 +++ kcalc-4.9.90-misc/kcalc_core.cpp 2012-12-08 20:05:58.000000000 +0100 @@ -99,7 +99,13 @@ } KNumber ExecMod(const KNumber &left_op, const KNumber &right_op) { - return left_op % right_op; + KNumber tmp_result = left_op % right_op; + + if ( right_op < KNumber::Zero ) + return -(-left_op % -right_op); + if ( tmp_result < KNumber::Zero ) + tmp_result += right_op; + return tmp_result; } KNumber ExecIntDiv(const KNumber &left_op, const KNumber &right_op) { @@ -535,8 +541,11 @@ void CalcEngine::Factorial(const KNumber &input) { - if (input == KNumber::PosInfinity) return; - if (input < KNumber::Zero || input.type() == KNumber::TYPE_ERROR) { + if (input == KNumber::PosInfinity || input > KNumber(999999)) { + last_number_ = KNumber::PosInfinity; + return; + } + if (input < KNumber::Zero || input.type() != KNumber::TYPE_INTEGER) { error_ = true; last_number_ = KNumber::NaN; return;