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