File indexing completed on 2024-05-05 05:52:43

0001 /*
0002     SPDX-FileCopyrightText: 2001-2013 Evan Teran <evan.teran@gmail.com>
0003     SPDX-FileCopyrightText: 2003-2005 Klaus Niederkrueger <kniederk@math.uni-koeln.de>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "knumber.h"
0009 #include <QString>
0010 #include <cstdlib>
0011 #include <iostream>
0012 #include <limits>
0013 
0014 namespace
0015 {
0016 const int precision = 12;
0017 
0018 QString numtypeToString(int arg)
0019 {
0020     switch (arg) {
0021     case 0:
0022         return QStringLiteral("Special");
0023     case 1:
0024         return QStringLiteral("Integer");
0025     case 3:
0026         return QStringLiteral("Fraction");
0027     case 2:
0028         return QStringLiteral("Float");
0029     default:
0030         return QLatin1String("Unknown:") + QString::number(arg);
0031     }
0032 }
0033 
0034 void checkResult(const QString &string, const KNumber &result, const QString &desired_string, int desired)
0035 {
0036     std::cout << "Testing result of: " << qPrintable(string) << " should give " << qPrintable(desired_string) << " and gives "
0037               << qPrintable(result.toQString(precision)) << " ...\n";
0038 
0039     std::cout << "The type of the result should be " << qPrintable(numtypeToString(desired)) << " and gives " << qPrintable(numtypeToString(result.type()))
0040               << " ... ";
0041 
0042     if (result.type() == desired && result.toQString(precision) == desired_string) {
0043         std::cout << "OK\n";
0044         return;
0045     }
0046 
0047     std::cout << "Failed\n";
0048     exit(1);
0049 }
0050 
0051 void checkTruth(const QString &string, bool computation, bool desired_result)
0052 {
0053     std::cout << "Testing truth of: " << qPrintable(string) << " should be " << desired_result << " and is " << computation << " ... ";
0054 
0055     if (computation == desired_result) {
0056         std::cout << "OK\n";
0057         return;
0058     }
0059 
0060     std::cout << "Failed\n";
0061     exit(1);
0062 }
0063 
0064 void checkType(const QString &string, int test_arg, int desired)
0065 {
0066     std::cout << "Testing type of: " << qPrintable(string) << " should give " << qPrintable(numtypeToString(desired)) << " and gives "
0067               << qPrintable(numtypeToString(test_arg)) << " ...";
0068 
0069     if (test_arg == desired) {
0070         std::cout << "OK\n";
0071         return;
0072     }
0073 
0074     std::cout << "Failed\n";
0075     exit(1);
0076 }
0077 
0078 void testingCompare()
0079 {
0080     std::cout << "\n\n";
0081     std::cout << "Testing Compare:\n";
0082     std::cout << "----------------\n";
0083 
0084     checkTruth(QStringLiteral("KNumber(5) == KNumber(2)"), KNumber(5) == KNumber(2), false);
0085     checkTruth(QStringLiteral("KNumber(5) > KNumber(2)"), KNumber(5) > KNumber(2), true);
0086     checkTruth(QStringLiteral("KNumber(5) < KNumber(2)"), KNumber(5) < KNumber(2), false);
0087     checkTruth(QStringLiteral("KNumber(5) < KNumber(0)"), KNumber(5) < KNumber(0), false);
0088     checkTruth(QStringLiteral("KNumber(-5) < KNumber(0)"), KNumber(-5) < KNumber(0), true);
0089     checkTruth(QStringLiteral("KNumber(5) >= KNumber(2)"), KNumber(5) >= KNumber(2), true);
0090     checkTruth(QStringLiteral("KNumber(5) <= KNumber(2)"), KNumber(5) <= KNumber(2), false);
0091     checkTruth(QStringLiteral("KNumber(5) != KNumber(2)"), KNumber(5) != KNumber(2), true);
0092 
0093     checkTruth(QStringLiteral("KNumber(2) == KNumber(2)"), KNumber(2) == KNumber(2), true);
0094     checkTruth(QStringLiteral("KNumber(2) > KNumber(2)"), KNumber(2) > KNumber(2), false);
0095     checkTruth(QStringLiteral("KNumber(2) < KNumber(2)"), KNumber(2) < KNumber(2), false);
0096     checkTruth(QStringLiteral("KNumber(2) >= KNumber(2)"), KNumber(2) >= KNumber(2), true);
0097     checkTruth(QStringLiteral("KNumber(2) <= KNumber(2)"), KNumber(2) <= KNumber(2), true);
0098     checkTruth(QStringLiteral("KNumber(2) != KNumber(2)"), KNumber(2) != KNumber(2), false);
0099 
0100     checkTruth(QStringLiteral("KNumber(5) == KNumber(\"1/2\")"), KNumber(5) == KNumber(QStringLiteral("1/2")), false);
0101     checkTruth(QStringLiteral("KNumber(5) > KNumber(\"1/2\")"), KNumber(5) > KNumber(QStringLiteral("1/2")), true);
0102     checkTruth(QStringLiteral("KNumber(5) < KNumber(\"1/2\")"), KNumber(5) < KNumber(QStringLiteral("1/2")), false);
0103     checkTruth(QStringLiteral("KNumber(5) >= KNumber(\"1/2\")"), KNumber(5) >= KNumber(QStringLiteral("1/2")), true);
0104     checkTruth(QStringLiteral("KNumber(5) <= KNumber(\"1/2\")"), KNumber(5) <= KNumber(QStringLiteral("1/2")), false);
0105     checkTruth(QStringLiteral("KNumber(5) != KNumber(\"1/2\")"), KNumber(5) != KNumber(QStringLiteral("1/2")), true);
0106 
0107     checkTruth(QStringLiteral("KNumber(\"1/2\") == KNumber(\"1/2\")"), KNumber(QStringLiteral("1/2")) == KNumber(QStringLiteral("1/2")), true);
0108     checkTruth(QStringLiteral("KNumber(\"1/2\") > KNumber(\"1/2\")"), KNumber(QStringLiteral("1/2")) > KNumber(QStringLiteral("1/2")), false);
0109     checkTruth(QStringLiteral("KNumber(\"1/2\") < KNumber(\"1/2\")"), KNumber(QStringLiteral("1/2")) < KNumber(QStringLiteral("1/2")), false);
0110     checkTruth(QStringLiteral("KNumber(\"1/2\") >= KNumber(\"1/2\")"), KNumber(QStringLiteral("1/2")) >= KNumber(QStringLiteral("1/2")), true);
0111     checkTruth(QStringLiteral("KNumber(\"1/2\") <= KNumber(\"1/2\")"), KNumber(QStringLiteral("1/2")) <= KNumber(QStringLiteral("1/2")), true);
0112     checkTruth(QStringLiteral("KNumber(\"1/2\") != KNumber(\"1/2\")"), KNumber(QStringLiteral("1/2")) != KNumber(QStringLiteral("1/2")), false);
0113 
0114     checkTruth(QStringLiteral("KNumber(\"3/2\") == KNumber(\"1/2\")"), KNumber(QStringLiteral("3/2")) == KNumber(QStringLiteral("1/2")), false);
0115     checkTruth(QStringLiteral("KNumber(\"3/2\") > KNumber(\"1/2\")"), KNumber(QStringLiteral("3/2")) > KNumber(QStringLiteral("1/2")), true);
0116     checkTruth(QStringLiteral("KNumber(\"3/2\") < KNumber(\"1/2\")"), KNumber(QStringLiteral("3/2")) < KNumber(QStringLiteral("1/2")), false);
0117     checkTruth(QStringLiteral("KNumber(\"3/2\") >= KNumber(\"1/2\")"), KNumber(QStringLiteral("3/2")) >= KNumber(QStringLiteral("1/2")), true);
0118     checkTruth(QStringLiteral("KNumber(\"3/2\") <= KNumber(\"1/2\")"), KNumber(QStringLiteral("3/2")) <= KNumber(QStringLiteral("1/2")), false);
0119     checkTruth(QStringLiteral("KNumber(\"3/2\") != KNumber(\"1/2\")"), KNumber(QStringLiteral("3/2")) != KNumber(QStringLiteral("1/2")), true);
0120 
0121     checkTruth(QStringLiteral("KNumber(3.2) != KNumber(3)"), KNumber(3.2) != KNumber(3), true);
0122     checkTruth(QStringLiteral("KNumber(3.2) > KNumber(3)"), KNumber(3.2) > KNumber(3), true);
0123     checkTruth(QStringLiteral("KNumber(3.2) < KNumber(3)"), KNumber(3.2) < KNumber(3), false);
0124 
0125     checkTruth(QStringLiteral("KNumber(3.2) < KNumber(\"3/5\")"), KNumber(3.2) < KNumber(QStringLiteral("3/5")), false);
0126 }
0127 
0128 void testingAdditions()
0129 {
0130     std::cout << "\n\n";
0131     std::cout << "Testing additions:\n";
0132     std::cout << "------------------\n";
0133 
0134     checkResult(QStringLiteral("KNumber(5) + KNumber(2)"), KNumber(5) + KNumber(2), QStringLiteral("7"), KNumber::TYPE_INTEGER);
0135     checkResult(QStringLiteral("KNumber(5) + KNumber(\"2/3\")"), KNumber(5) + KNumber(QStringLiteral("2/3")), QStringLiteral("17/3"), KNumber::TYPE_FRACTION);
0136     checkResult(QStringLiteral("KNumber(5) + KNumber(\"2.3\")"), KNumber(5) + KNumber(QStringLiteral("2.3")), QStringLiteral("7.3"), KNumber::TYPE_FLOAT);
0137 
0138     checkResult(QStringLiteral("KNumber(\"5/3\") + KNumber(2)"), KNumber(QStringLiteral("5/3")) + KNumber(2), QStringLiteral("11/3"), KNumber::TYPE_FRACTION);
0139     checkResult(QStringLiteral("KNumber(\"5/3\") + KNumber(\"2/3\")"),
0140                 KNumber(QStringLiteral("5/3")) + KNumber(QStringLiteral("2/3")),
0141                 QStringLiteral("7/3"),
0142                 KNumber::TYPE_FRACTION);
0143     checkResult(QStringLiteral("KNumber(\"5/3\") + KNumber(\"1/3\")"),
0144                 KNumber(QStringLiteral("5/3")) + KNumber(QStringLiteral("1/3")),
0145                 QStringLiteral("2"),
0146                 KNumber::TYPE_INTEGER);
0147     checkResult(QStringLiteral("KNumber(\"5/3\") + KNumber(\"-26/3\")"),
0148                 KNumber(QStringLiteral("5/3")) + KNumber(QStringLiteral("-26/3")),
0149                 QStringLiteral("-7"),
0150                 KNumber::TYPE_INTEGER);
0151     checkResult(QStringLiteral("KNumber(\"5/2\") + KNumber(2.3)"), KNumber(QStringLiteral("5/2")) + KNumber(2.3), QStringLiteral("4.8"), KNumber::TYPE_FLOAT);
0152 
0153     checkResult(QStringLiteral("KNumber(5.3) + KNumber(2)"), KNumber(5.3) + KNumber(2), QStringLiteral("7.3"), KNumber::TYPE_FLOAT);
0154     checkResult(QStringLiteral("KNumber(5.3) + KNumber(\"2/4\")"), KNumber(5.3) + KNumber(QStringLiteral("2/4")), QStringLiteral("5.8"), KNumber::TYPE_FLOAT);
0155     checkResult(QStringLiteral("KNumber(5.3) + KNumber(2.3)"), KNumber(5.3) + KNumber(2.3), QStringLiteral("7.6"), KNumber::TYPE_FLOAT);
0156 }
0157 
0158 void testingSubtractions()
0159 {
0160     std::cout << "\n\n";
0161     std::cout << "Testing subtractions:\n";
0162     std::cout << "---------------------\n";
0163 
0164     checkResult(QStringLiteral("KNumber(5) - KNumber(2)"), KNumber(5) - KNumber(2), QStringLiteral("3"), KNumber::TYPE_INTEGER);
0165     checkResult(QStringLiteral("KNumber(5) - KNumber(\"2/3\")"), KNumber(5) - KNumber(QStringLiteral("2/3")), QStringLiteral("13/3"), KNumber::TYPE_FRACTION);
0166     checkResult(QStringLiteral("KNumber(5) - KNumber(2.3)"), KNumber(5) - KNumber(2.3), QStringLiteral("2.7"), KNumber::TYPE_FLOAT);
0167 
0168     checkResult(QStringLiteral("KNumber(\"5/3\") - KNumber(2)"), KNumber(QStringLiteral("5/3")) - KNumber(2), QStringLiteral("-1/3"), KNumber::TYPE_FRACTION);
0169     checkResult(QStringLiteral("KNumber(\"5/3\") - KNumber(\"1/3\")"),
0170                 KNumber(QStringLiteral("5/3")) - KNumber(QStringLiteral("1/3")),
0171                 QStringLiteral("4/3"),
0172                 KNumber::TYPE_FRACTION);
0173     checkResult(QStringLiteral("KNumber(\"5/3\") - KNumber(\"2/3\")"),
0174                 KNumber(QStringLiteral("5/3")) - KNumber(QStringLiteral("2/3")),
0175                 QStringLiteral("1"),
0176                 KNumber::TYPE_INTEGER);
0177     checkResult(QStringLiteral("KNumber(\"-5/3\") - KNumber(\"4/3\")"),
0178                 KNumber(QStringLiteral("-5/3")) - KNumber(QStringLiteral("4/3")),
0179                 QStringLiteral("-3"),
0180                 KNumber::TYPE_INTEGER);
0181     checkResult(QStringLiteral("KNumber(\"5/4\") - KNumber(2.2)"), KNumber(QStringLiteral("5/4")) - KNumber(2.2), QStringLiteral("-0.95"), KNumber::TYPE_FLOAT);
0182 
0183     checkResult(QStringLiteral("KNumber(5.3) - KNumber(2)"), KNumber(5.3) - KNumber(2), QStringLiteral("3.3"), KNumber::TYPE_FLOAT);
0184     checkResult(QStringLiteral("KNumber(5.3) - KNumber(\"3/4\")"), KNumber(5.3) - KNumber(QStringLiteral("3/4")), QStringLiteral("4.55"), KNumber::TYPE_FLOAT);
0185     checkResult(QStringLiteral("KNumber(5.3) - KNumber(2.3)"), KNumber(5.3) - KNumber(2.3), QStringLiteral("3"), KNumber::TYPE_INTEGER);
0186 }
0187 
0188 void testingSpecial()
0189 {
0190     std::cout << "\n\n";
0191     std::cout << "Testing special functions:\n";
0192     std::cout << "--------------------------\n";
0193 
0194     checkResult(QStringLiteral("log10(KNumber(5))"), log10(KNumber(5)), QStringLiteral("0.698970004336"), KNumber::TYPE_FLOAT);
0195     checkResult(QStringLiteral("log10(pow(KNumber(10), KNumber(308)))"), log10(pow(KNumber(10), KNumber(308))), QStringLiteral("308"), KNumber::TYPE_INTEGER);
0196 
0197     // TODO: enable this check once MPFR is commonly enabled
0198     // checkResult(QStringLiteral("log10(pow(KNumber(10), KNumber(309)))"), log10(pow(KNumber(10), KNumber(309))), QLatin1String("309"), KNumber::TYPE_INTEGER);
0199 
0200     checkResult(QStringLiteral("exp(KNumber(4.34))"), exp(KNumber(4.34)), QStringLiteral("76.7075393383"), KNumber::TYPE_FLOAT);
0201 }
0202 
0203 void testingTrig()
0204 {
0205     std::cout << "\n\n";
0206     std::cout << "Testing trig functions:\n";
0207     std::cout << "-----------------------\n";
0208 
0209     checkResult(QStringLiteral("sin(KNumber(5))"), sin(KNumber(5)), QStringLiteral("-0.958924274663"), KNumber::TYPE_FLOAT);
0210     checkResult(QStringLiteral("cos(KNumber(5))"), cos(KNumber(5)), QStringLiteral("0.283662185463"), KNumber::TYPE_FLOAT);
0211     checkResult(QStringLiteral("tan(KNumber(5))"), tan(KNumber(5)), QStringLiteral("-3.38051500625"), KNumber::TYPE_FLOAT);
0212     checkResult(QStringLiteral("sin(KNumber(-5))"), sin(KNumber(-5)), QStringLiteral("0.958924274663"), KNumber::TYPE_FLOAT);
0213     checkResult(QStringLiteral("cos(KNumber(-5))"), cos(KNumber(-5)), QStringLiteral("0.283662185463"), KNumber::TYPE_FLOAT);
0214     checkResult(QStringLiteral("tan(KNumber(-5))"), tan(KNumber(-5)), QStringLiteral("3.38051500625"), KNumber::TYPE_FLOAT);
0215 
0216     checkResult(QStringLiteral("sin(KNumber(\"5/2\"))"), sin(KNumber(QStringLiteral("5/2"))), QStringLiteral("0.598472144104"), KNumber::TYPE_FLOAT);
0217     checkResult(QStringLiteral("cos(KNumber(\"5/2\"))"), cos(KNumber(QStringLiteral("5/2"))), QStringLiteral("-0.801143615547"), KNumber::TYPE_FLOAT);
0218     checkResult(QStringLiteral("tan(KNumber(\"5/2\"))"), tan(KNumber(QStringLiteral("5/2"))), QStringLiteral("-0.747022297239"), KNumber::TYPE_FLOAT);
0219     checkResult(QStringLiteral("sin(KNumber(\"-5/2\"))"), sin(KNumber(QStringLiteral("-5/2"))), QStringLiteral("-0.598472144104"), KNumber::TYPE_FLOAT);
0220     checkResult(QStringLiteral("cos(KNumber(\"-5/2\"))"), cos(KNumber(QStringLiteral("-5/2"))), QStringLiteral("-0.801143615547"), KNumber::TYPE_FLOAT);
0221     checkResult(QStringLiteral("tan(KNumber(\"-5/2\"))"), tan(KNumber(QStringLiteral("-5/2"))), QStringLiteral("0.747022297239"), KNumber::TYPE_FLOAT);
0222 
0223     checkResult(QStringLiteral("sin(KNumber(5.3))"), sin(KNumber(5.3)), QStringLiteral("-0.832267442224"), KNumber::TYPE_FLOAT);
0224     checkResult(QStringLiteral("cos(KNumber(5.3))"), cos(KNumber(5.3)), QStringLiteral("0.554374336179"), KNumber::TYPE_FLOAT);
0225     checkResult(QStringLiteral("tan(KNumber(5.3))"), tan(KNumber(5.3)), QStringLiteral("-1.50127339581"), KNumber::TYPE_FLOAT);
0226     checkResult(QStringLiteral("sin(KNumber(-5.3))"), sin(KNumber(-5.3)), QStringLiteral("0.832267442224"), KNumber::TYPE_FLOAT);
0227     checkResult(QStringLiteral("cos(KNumber(-5.3))"), cos(KNumber(-5.3)), QStringLiteral("0.554374336179"), KNumber::TYPE_FLOAT);
0228     checkResult(QStringLiteral("tan(KNumber(-5.3))"), tan(KNumber(-5.3)), QStringLiteral("1.50127339581"), KNumber::TYPE_FLOAT);
0229 
0230     checkResult(QStringLiteral("asin(KNumber(5))"), asin(KNumber(5)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0231     checkResult(QStringLiteral("acos(KNumber(5))"), acos(KNumber(5)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0232     checkResult(QStringLiteral("atan(KNumber(5))"), atan(KNumber(5)), QStringLiteral("1.37340076695"), KNumber::TYPE_FLOAT);
0233     checkResult(QStringLiteral("asin(KNumber(-5))"), asin(KNumber(-5)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0234     checkResult(QStringLiteral("acos(KNumber(-5))"), acos(KNumber(-5)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0235     checkResult(QStringLiteral("atan(KNumber(-5))"), atan(KNumber(-5)), QStringLiteral("-1.37340076695"), KNumber::TYPE_FLOAT);
0236 
0237     checkResult(QStringLiteral("asin(KNumber(\"5/2\"))"), asin(KNumber(QStringLiteral("5/2"))), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0238     checkResult(QStringLiteral("acos(KNumber(\"5/2\"))"), acos(KNumber(QStringLiteral("5/2"))), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0239     checkResult(QStringLiteral("atan(KNumber(\"5/2\"))"), atan(KNumber(QStringLiteral("5/2"))), QStringLiteral("1.19028994968"), KNumber::TYPE_FLOAT);
0240     checkResult(QStringLiteral("asin(KNumber(\"-5/2\"))"), asin(KNumber(QStringLiteral("-5/2"))), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0241     checkResult(QStringLiteral("acos(KNumber(\"-5/2\"))"), acos(KNumber(QStringLiteral("-5/2"))), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0242     checkResult(QStringLiteral("atan(KNumber(\"-5/2\"))"), atan(KNumber(QStringLiteral("-5/2"))), QStringLiteral("-1.19028994968"), KNumber::TYPE_FLOAT);
0243 
0244     checkResult(QStringLiteral("asin(KNumber(5.3))"), asin(KNumber(5.3)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0245     checkResult(QStringLiteral("acos(KNumber(5.3))"), acos(KNumber(5.3)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0246     checkResult(QStringLiteral("atan(KNumber(5.3))"), atan(KNumber(5.3)), QStringLiteral("1.38430942513"), KNumber::TYPE_FLOAT);
0247     checkResult(QStringLiteral("asin(KNumber(-5.3))"), asin(KNumber(-5.3)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0248     checkResult(QStringLiteral("acos(KNumber(-5.3))"), acos(KNumber(-5.3)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0249     checkResult(QStringLiteral("atan(KNumber(-5.3))"), atan(KNumber(-5.3)), QStringLiteral("-1.38430942513"), KNumber::TYPE_FLOAT);
0250 
0251     checkResult(QStringLiteral("asin(KNumber(\"2/5\"))"), asin(KNumber(QStringLiteral("2/5"))), QStringLiteral("0.411516846067"), KNumber::TYPE_FLOAT);
0252     checkResult(QStringLiteral("acos(KNumber(\"2/5\"))"), acos(KNumber(QStringLiteral("2/5"))), QStringLiteral("1.15927948073"), KNumber::TYPE_FLOAT);
0253     checkResult(QStringLiteral("atan(KNumber(\"2/5\"))"), atan(KNumber(QStringLiteral("2/5"))), QStringLiteral("0.380506377112"), KNumber::TYPE_FLOAT);
0254     checkResult(QStringLiteral("asin(KNumber(\"-2/5\"))"), asin(KNumber(QStringLiteral("-2/5"))), QStringLiteral("-0.411516846067"), KNumber::TYPE_FLOAT);
0255     checkResult(QStringLiteral("acos(KNumber(\"-2/5\"))"), acos(KNumber(QStringLiteral("-2/5"))), QStringLiteral("1.98231317286"), KNumber::TYPE_FLOAT);
0256     checkResult(QStringLiteral("atan(KNumber(\"-2/5\"))"), atan(KNumber(QStringLiteral("-2/5"))), QStringLiteral("-0.380506377112"), KNumber::TYPE_FLOAT);
0257 
0258     checkResult(QStringLiteral("asin(KNumber(0.3))"), asin(KNumber(0.3)), QStringLiteral("0.304692654015"), KNumber::TYPE_FLOAT);
0259     checkResult(QStringLiteral("acos(KNumber(0.3))"), acos(KNumber(0.3)), QStringLiteral("1.26610367278"), KNumber::TYPE_FLOAT);
0260     checkResult(QStringLiteral("atan(KNumber(0.3))"), atan(KNumber(0.3)), QStringLiteral("0.291456794478"), KNumber::TYPE_FLOAT);
0261     checkResult(QStringLiteral("asin(KNumber(-0.3))"), asin(KNumber(-0.3)), QStringLiteral("-0.304692654015"), KNumber::TYPE_FLOAT);
0262     checkResult(QStringLiteral("acos(KNumber(-0.3))"), acos(KNumber(-0.3)), QStringLiteral("1.87548898081"), KNumber::TYPE_FLOAT);
0263     checkResult(QStringLiteral("atan(KNumber(-0.3))"), atan(KNumber(-0.3)), QStringLiteral("-0.291456794478"), KNumber::TYPE_FLOAT);
0264 }
0265 
0266 void testingMultiplications()
0267 {
0268     std::cout << "\n\n";
0269     std::cout << "Testing multiplications:\n";
0270     std::cout << "------------------------\n";
0271 
0272     checkResult(QStringLiteral("KNumber(5) * KNumber(2)"), KNumber(5) * KNumber(2), QStringLiteral("10"), KNumber::TYPE_INTEGER);
0273     checkResult(QStringLiteral("KNumber(5) * KNumber(\"2/3\")"), KNumber(5) * KNumber(QStringLiteral("2/3")), QStringLiteral("10/3"), KNumber::TYPE_FRACTION);
0274     checkResult(QStringLiteral("KNumber(5) * KNumber(\"2/5\")"), KNumber(5) * KNumber(QStringLiteral("2/5")), QStringLiteral("2"), KNumber::TYPE_INTEGER);
0275     checkResult(QStringLiteral("KNumber(5) * KNumber(2.3)"), KNumber(5) * KNumber(2.3), QStringLiteral("11.5"), KNumber::TYPE_FLOAT);
0276     checkResult(QStringLiteral("KNumber(0) * KNumber(\"2/5\")"), KNumber(0) * KNumber(QStringLiteral("2/5")), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0277     checkResult(QStringLiteral("KNumber(0) * KNumber(2.3)"), KNumber(0) * KNumber(2.3), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0278 
0279     checkResult(QStringLiteral("KNumber(\"5/3\") * KNumber(2)"), KNumber(QStringLiteral("5/3")) * KNumber(2), QStringLiteral("10/3"), KNumber::TYPE_FRACTION);
0280     checkResult(QStringLiteral("KNumber(\"5/3\") * KNumber(0)"), KNumber(QStringLiteral("5/3")) * KNumber(0), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0281     checkResult(QStringLiteral("KNumber(\"5/3\") * KNumber(\"2/3\")"),
0282                 KNumber(QStringLiteral("5/3")) * KNumber(QStringLiteral("2/3")),
0283                 QStringLiteral("10/9"),
0284                 KNumber::TYPE_FRACTION);
0285     checkResult(QStringLiteral("KNumber(\"25/6\") * KNumber(\"12/5\")"),
0286                 KNumber(QStringLiteral("25/6")) * KNumber(QStringLiteral("12/5")),
0287                 QStringLiteral("10"),
0288                 KNumber::TYPE_INTEGER);
0289     checkResult(QStringLiteral("KNumber(\"5/2\") * KNumber(2.3)"), KNumber(QStringLiteral("5/2")) * KNumber(2.3), QStringLiteral("5.75"), KNumber::TYPE_FLOAT);
0290 
0291     checkResult(QStringLiteral("KNumber(5.3) * KNumber(2)"), KNumber(5.3) * KNumber(2), QStringLiteral("10.6"), KNumber::TYPE_FLOAT);
0292     checkResult(QStringLiteral("KNumber(5.3) * KNumber(0)"), KNumber(5.3) * KNumber(0), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0293     checkResult(QStringLiteral("KNumber(5.3) * KNumber(\"1/2\")"), KNumber(5.3) * KNumber(QStringLiteral("1/2")), QStringLiteral("2.65"), KNumber::TYPE_FLOAT);
0294     checkResult(QStringLiteral("KNumber(5.3) * KNumber(2.3)"), KNumber(5.3) * KNumber(2.3), QStringLiteral("12.19"), KNumber::TYPE_FLOAT);
0295 }
0296 
0297 void testingDivisions()
0298 {
0299     std::cout << "\n\n";
0300     std::cout << "Testing divisions:\n";
0301     std::cout << "------------------\n";
0302 
0303     checkResult(QStringLiteral("KNumber(5) / KNumber(2)"), KNumber(5) / KNumber(2), QStringLiteral("5/2"), KNumber::TYPE_FRACTION);
0304     checkResult(QStringLiteral("KNumber(122) / KNumber(2)"), KNumber(122) / KNumber(2), QStringLiteral("61"), KNumber::TYPE_INTEGER);
0305     checkResult(QStringLiteral("KNumber(12) / KNumber(0)"), KNumber(12) / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0306     checkResult(QStringLiteral("KNumber(-12) / KNumber(0)"), KNumber(-12) / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0307     checkResult(QStringLiteral("KNumber(5) / KNumber(\"2/3\")"), KNumber(5) / KNumber(QStringLiteral("2/3")), QStringLiteral("15/2"), KNumber::TYPE_FRACTION);
0308     checkResult(QStringLiteral("KNumber(6) / KNumber(\"2/3\")"), KNumber(6) / KNumber(QStringLiteral("2/3")), QStringLiteral("9"), KNumber::TYPE_INTEGER);
0309     checkResult(QStringLiteral("KNumber(5) / KNumber(2.5)"), KNumber(5) / KNumber(2.5), QStringLiteral("2"), KNumber::TYPE_INTEGER);
0310     checkResult(QStringLiteral("KNumber(5) / KNumber(0.0)"), KNumber(5) / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0311     checkResult(QStringLiteral("KNumber(-5) / KNumber(0.0)"), KNumber(-5) / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0312 
0313     checkResult(QStringLiteral("KNumber(\"5/3\") / KNumber(2)"), KNumber(QStringLiteral("5/3")) / KNumber(2), QStringLiteral("5/6"), KNumber::TYPE_FRACTION);
0314     checkResult(QStringLiteral("KNumber(\"5/3\") / KNumber(0)"), KNumber(QStringLiteral("5/3")) / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0315     checkResult(QStringLiteral("KNumber(\"-5/3\") / KNumber(0)"), KNumber(QStringLiteral("-5/3")) / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0316     checkResult(QStringLiteral("KNumber(\"5/3\") / KNumber(\"2/3\")"),
0317                 KNumber(QStringLiteral("5/3")) / KNumber(QStringLiteral("2/3")),
0318                 QStringLiteral("5/2"),
0319                 KNumber::TYPE_FRACTION);
0320     checkResult(QStringLiteral("KNumber(\"49/3\") / KNumber(\"7/9\")"),
0321                 KNumber(QStringLiteral("49/3")) / KNumber(QStringLiteral("7/9")),
0322                 QStringLiteral("21"),
0323                 KNumber::TYPE_INTEGER);
0324     checkResult(QStringLiteral("KNumber(\"5/2\") / KNumber(2.5)"), KNumber(QStringLiteral("5/2")) / KNumber(2.5), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0325     checkResult(QStringLiteral("KNumber(\"5/2\") / KNumber(0.0)"), KNumber(QStringLiteral("5/2")) / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0326     checkResult(QStringLiteral("KNumber(\"-5/2\") / KNumber(0.0)"), KNumber(QStringLiteral("-5/2")) / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0327 
0328     checkResult(QStringLiteral("KNumber(5.3) / KNumber(2)"), KNumber(5.3) / KNumber(2), QStringLiteral("2.65"), KNumber::TYPE_FLOAT);
0329     checkResult(QStringLiteral("KNumber(5.3) / KNumber(0)"), KNumber(5.3) / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0330     checkResult(QStringLiteral("KNumber(-5.3) / KNumber(0)"), KNumber(-5.3) / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0331     checkResult(QStringLiteral("KNumber(5.3) / KNumber(\"2/3\")"), KNumber(5.3) / KNumber(QStringLiteral("2/3")), QStringLiteral("7.95"), KNumber::TYPE_FLOAT);
0332     checkResult(QStringLiteral("KNumber(5.5) / KNumber(2.5)"), KNumber(5.5) / KNumber(2.5), QStringLiteral("2.2"), KNumber::TYPE_FLOAT);
0333     checkResult(QStringLiteral("KNumber(5.5) / KNumber(0.0)"), KNumber(5.5) / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0334     checkResult(QStringLiteral("KNumber(-5.5) / KNumber(0.0)"), KNumber(-5.5) / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0335 }
0336 
0337 void testingModulus()
0338 {
0339     std::cout << "\n\n";
0340     std::cout << "Testing modulus:\n";
0341     std::cout << "----------------\n";
0342 
0343     checkResult(QStringLiteral("KNumber(23) % KNumber(4)"), KNumber(23) % KNumber(4), QStringLiteral("3"), KNumber::TYPE_INTEGER);
0344     checkResult(QStringLiteral("KNumber(12) % KNumber(-5)"), KNumber(12) % KNumber(-5), QStringLiteral("2"), KNumber::TYPE_INTEGER);
0345     checkResult(QStringLiteral("KNumber(-12) % KNumber(5)"), KNumber(-12) % KNumber(5), QStringLiteral("3"), KNumber::TYPE_INTEGER);
0346     checkResult(QStringLiteral("KNumber(12) % KNumber(0)"), KNumber(-12) % KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0347     checkResult(QStringLiteral("KNumber(-12) % KNumber(0)"), KNumber(-12) % KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0348 
0349     // TODO: test for other types
0350 }
0351 
0352 void testingAndOr()
0353 {
0354     std::cout << "\n\n";
0355     std::cout << "Testing And/Or:\n";
0356     std::cout << "---------------\n";
0357 
0358     checkResult(QStringLiteral("KNumber(17) & KNumber(9)"), KNumber(17) & KNumber(9), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0359     checkResult(QStringLiteral("KNumber(17) | KNumber(9)"), KNumber(17) | KNumber(9), QStringLiteral("25"), KNumber::TYPE_INTEGER);
0360     checkResult(QStringLiteral("KNumber(1023) & KNumber(255)"), KNumber(1023) & KNumber(255), QStringLiteral("255"), KNumber::TYPE_INTEGER);
0361     checkResult(QStringLiteral("KNumber(1023) | KNumber(255)"), KNumber(1023) | KNumber(255), QStringLiteral("1023"), KNumber::TYPE_INTEGER);
0362 
0363     // TODO: test for other types
0364 }
0365 
0366 void testingAbs()
0367 {
0368     std::cout << "\n\n";
0369     std::cout << "Testing absolute value:\n";
0370     std::cout << "-----------------------\n";
0371 
0372     checkResult(QStringLiteral("KNumber(5).abs()"), KNumber(5).abs(), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0373     checkResult(QStringLiteral("KNumber(\"2/3\").abs()"), KNumber(QStringLiteral("2/3")).abs(), QStringLiteral("2/3"), KNumber::TYPE_FRACTION);
0374     checkResult(QStringLiteral("KNumber(\"2.3\").abs()"), KNumber(QStringLiteral("2.3")).abs(), QStringLiteral("2.3"), KNumber::TYPE_FLOAT);
0375 
0376     checkResult(QStringLiteral("KNumber(-5).abs()"), KNumber(-5).abs(), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0377     checkResult(QStringLiteral("KNumber(\"-2/3\").abs()"), KNumber(QStringLiteral("-2/3")).abs(), QStringLiteral("2/3"), KNumber::TYPE_FRACTION);
0378     checkResult(QStringLiteral("KNumber(\"-2.3\").abs()"), KNumber(QStringLiteral("-2.3")).abs(), QStringLiteral("2.3"), KNumber::TYPE_FLOAT);
0379 }
0380 
0381 void testingTruncateToInteger()
0382 {
0383     std::cout << "\n\n";
0384     std::cout << "Testing truncate to an integer:\n";
0385     std::cout << "-------------------------------\n";
0386 
0387     checkResult(QStringLiteral("KNumber(16).integerPart()"), KNumber(16).integerPart(), QStringLiteral("16"), KNumber::TYPE_INTEGER);
0388     checkResult(QStringLiteral("KNumber(\"43/9\").integerPart()"), KNumber(QStringLiteral("43/9")).integerPart(), QStringLiteral("4"), KNumber::TYPE_INTEGER);
0389     checkResult(QStringLiteral("KNumber(\"-43/9\").integerPart()"),
0390                 KNumber(QStringLiteral("-43/9")).integerPart(),
0391                 QStringLiteral("-4"),
0392                 KNumber::TYPE_INTEGER);
0393     checkResult(QStringLiteral("KNumber(\"5.25\").integerPart()"), KNumber(QStringLiteral("5.25")).integerPart(), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0394     checkResult(QStringLiteral("KNumber(\"-5.25\").integerPart()"),
0395                 KNumber(QStringLiteral("-5.25")).integerPart(),
0396                 QStringLiteral("-5"),
0397                 KNumber::TYPE_INTEGER);
0398 }
0399 
0400 void testingSqrt()
0401 {
0402     std::cout << "\n\n";
0403     std::cout << "Testing square root, cubic root:\n";
0404     std::cout << "--------------------------------\n";
0405 
0406     checkResult(QStringLiteral("KNumber(16).sqrt()"), KNumber(16).sqrt(), QStringLiteral("4"), KNumber::TYPE_INTEGER);
0407     checkResult(QStringLiteral("KNumber(-16).sqrt()"), KNumber(-16).sqrt(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0408     checkResult(QStringLiteral("KNumber(\"16/9\").sqrt()"), KNumber(QStringLiteral("16/9")).sqrt(), QStringLiteral("4/3"), KNumber::TYPE_FRACTION);
0409     checkResult(QStringLiteral("KNumber(\"-16/9\").sqrt()"), KNumber(QStringLiteral("-16/9")).sqrt(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0410     checkResult(QStringLiteral("KNumber(2).sqrt()"), KNumber(2).sqrt(), QStringLiteral("1.41421356237"), KNumber::TYPE_FLOAT);
0411     checkResult(QStringLiteral("KNumber(\"2/3\").sqrt()"), KNumber(QStringLiteral("2/3")).sqrt(), QStringLiteral("0.816496580928"), KNumber::TYPE_FLOAT);
0412     checkResult(QStringLiteral("KNumber(\"0.25\").sqrt()"), KNumber(QStringLiteral("0.25")).sqrt(), QStringLiteral("0.5"), KNumber::TYPE_FLOAT);
0413     checkResult(QStringLiteral("KNumber(\"-0.25\").sqrt()"), KNumber(QStringLiteral("-0.25")).sqrt(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0414 
0415     checkResult(QStringLiteral("KNumber(27).cbrt()"), KNumber(27).cbrt(), QStringLiteral("3"), KNumber::TYPE_INTEGER);
0416     checkResult(QStringLiteral("KNumber(-27).cbrt()"), KNumber(-27).cbrt(), QStringLiteral("-3"), KNumber::TYPE_INTEGER);
0417     checkResult(QStringLiteral("KNumber(\"27/8\").cbrt()"), KNumber(QStringLiteral("27/8")).cbrt(), QStringLiteral("3/2"), KNumber::TYPE_FRACTION);
0418     checkResult(QStringLiteral("KNumber(\"-8/27\").cbrt()"), KNumber(QStringLiteral("-8/27")).cbrt(), QStringLiteral("-2/3"), KNumber::TYPE_FRACTION);
0419     // TODO: need to check non-perfect cube roots
0420     checkResult(QStringLiteral("KNumber(2).cbrt()"), KNumber(2).cbrt(), QStringLiteral("1.25992104989"), KNumber::TYPE_FLOAT);
0421     checkResult(QStringLiteral("KNumber(\"2/3\").cbrt()"), KNumber(QStringLiteral("2/3")).cbrt(), QStringLiteral("0.873580464736"), KNumber::TYPE_FLOAT);
0422     checkResult(QStringLiteral("KNumber(\"0.25\").cbrt()"), KNumber(QStringLiteral("0.25")).cbrt(), QStringLiteral("0.629960524947"), KNumber::TYPE_FLOAT);
0423     checkResult(QStringLiteral("KNumber(\"-0.25\").cbrt()"), KNumber(QStringLiteral("-0.25")).cbrt(), QStringLiteral("-0.629960524947"), KNumber::TYPE_FLOAT);
0424 }
0425 
0426 void testingFactorial()
0427 {
0428     std::cout << "\n\n";
0429     std::cout << "Testing factorial:\n";
0430     std::cout << "------------------\n";
0431 
0432     checkResult(QStringLiteral("KNumber(-1).factorial()"), KNumber(-1).factorial(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0433     checkResult(QStringLiteral("KNumber(-2).factorial()"), KNumber(-2).factorial(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0434     checkResult(QStringLiteral("KNumber(-20).factorial()"), KNumber(-20).factorial(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0435     checkResult(QStringLiteral("KNumber(-1/2).factorial()"), KNumber(QStringLiteral("-1/2")).factorial(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0436     checkResult(QStringLiteral("KNumber(-0.5).factorial()"), KNumber(QStringLiteral("-0.5")).factorial(), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0437 
0438     checkResult(QStringLiteral("KNumber(0).factorial()"), KNumber(0).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0439     checkResult(QStringLiteral("KNumber(1).factorial()"), KNumber(1).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0440     checkResult(QStringLiteral("KNumber(2).factorial()"), KNumber(2).factorial(), QStringLiteral("2"), KNumber::TYPE_INTEGER);
0441     checkResult(QStringLiteral("KNumber(3).factorial()"), KNumber(3).factorial(), QStringLiteral("6"), KNumber::TYPE_INTEGER);
0442     checkResult(QStringLiteral("KNumber(4).factorial()"), KNumber(4).factorial(), QStringLiteral("24"), KNumber::TYPE_INTEGER);
0443     checkResult(QStringLiteral("KNumber(5).factorial()"), KNumber(5).factorial(), QStringLiteral("120"), KNumber::TYPE_INTEGER);
0444     checkResult(QStringLiteral("KNumber(6).factorial()"), KNumber(6).factorial(), QStringLiteral("720"), KNumber::TYPE_INTEGER);
0445     checkResult(QStringLiteral("KNumber(9).factorial()"), KNumber(9).factorial(), QStringLiteral("362880"), KNumber::TYPE_INTEGER);
0446     checkResult(QStringLiteral("KNumber(12).factorial()"), KNumber(12).factorial(), QStringLiteral("479001600"), KNumber::TYPE_INTEGER);
0447     checkResult(QStringLiteral("KNumber(13).factorial()"), KNumber(13).factorial(), QStringLiteral("6227020800"), KNumber::TYPE_INTEGER);
0448 
0449     checkResult(QStringLiteral("KNumber(1/2).factorial()"), KNumber(QStringLiteral("1/2")).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0450     checkResult(QStringLiteral("KNumber(2/1).factorial()"), KNumber(QStringLiteral("2/1")).factorial(), QStringLiteral("2"), KNumber::TYPE_INTEGER);
0451     checkResult(QStringLiteral("KNumber(3/2).factorial()"), KNumber(QStringLiteral("3/2")).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0452 
0453     checkResult(QStringLiteral("KNumber(0.1).factorial()"), KNumber(0.1).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0454     checkResult(QStringLiteral("KNumber(0.5).factorial()"), KNumber(0.5).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0455     checkResult(QStringLiteral("KNumber(1.5).factorial()"), KNumber(1.5).factorial(), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0456     checkResult(QStringLiteral("KNumber(2.5).factorial()"), KNumber(2.5).factorial(), QStringLiteral("2"), KNumber::TYPE_INTEGER);
0457     checkResult(QStringLiteral("KNumber(3.5).factorial()"), KNumber(3.5).factorial(), QStringLiteral("6"), KNumber::TYPE_INTEGER);
0458 }
0459 
0460 void testingComplement()
0461 {
0462     std::cout << "\n\n";
0463     std::cout << "Testing complement:\n";
0464     std::cout << "-------------------\n";
0465 
0466     // at first glance, these look like they should work
0467     // but there is an annoyance. If we use the mpz_com function
0468     // ~-2 == 1, but the HEX/OCT/BIN views are broken :-(
0469     // specifically, if the value is negative, it goes badly pretty quick.
0470 #if 0
0471     checkResult(QStringLiteral("~KNumber(0)"), ~KNumber(0), QLatin1String("-1"), KNumber::TYPE_INTEGER);
0472     checkResult(QStringLiteral("~KNumber(1)"), ~KNumber(1), QLatin1String("-2"), KNumber::TYPE_INTEGER);
0473     checkResult(QStringLiteral("~KNumber(2)"), ~KNumber(2), QLatin1String("-3"), KNumber::TYPE_INTEGER);
0474     checkResult(QStringLiteral("~KNumber(8)"), ~KNumber(8), QLatin1String("-9"), KNumber::TYPE_INTEGER);
0475     checkResult(QStringLiteral("~KNumber(15)"), ~KNumber(15), QLatin1String("-16"), KNumber::TYPE_INTEGER);
0476     checkResult(QStringLiteral("~KNumber(-1)"), ~KNumber(-1), QLatin1String("0"), KNumber::TYPE_INTEGER);
0477     checkResult(QStringLiteral("~KNumber(-2)"), ~KNumber(-2), QLatin1String("1"), KNumber::TYPE_INTEGER);
0478     checkResult(QStringLiteral("~KNumber(-3)"), ~KNumber(-3), QLatin1String("2"), KNumber::TYPE_INTEGER);
0479     checkResult(QStringLiteral("~KNumber(-9)"), ~KNumber(-9), QLatin1String("8"), KNumber::TYPE_INTEGER);
0480     checkResult(QStringLiteral("~KNumber(-16)"), ~KNumber(-16), QLatin1String("15"), KNumber::TYPE_INTEGER);
0481 #endif
0482 
0483     checkResult(QStringLiteral("~KNumber(0.12345)"), ~KNumber(0.12345), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0484     checkResult(QStringLiteral("~KNumber(-0.12345)"), ~KNumber(-0.12345), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0485     checkResult(QStringLiteral("~KNumber(\"1/2\")"), ~KNumber(QStringLiteral("1/2")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0486     checkResult(QStringLiteral("~KNumber(\"-1/2\")"), ~KNumber(QStringLiteral("-1/2")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0487 }
0488 
0489 void testingShifts()
0490 {
0491     std::cout << "\n\n";
0492     std::cout << "Testing left/right shift:\n";
0493     std::cout << "-------------------------\n";
0494 
0495     checkResult(QStringLiteral("KNumber(16) << KNumber(2)"), KNumber(16) << KNumber(2), QStringLiteral("64"), KNumber::TYPE_INTEGER);
0496     checkResult(QStringLiteral("KNumber(16) >> KNumber(2)"), KNumber(16) >> KNumber(2), QStringLiteral("4"), KNumber::TYPE_INTEGER);
0497 }
0498 
0499 void testingPower()
0500 {
0501     std::cout << "\n\n";
0502     std::cout << "Testing Power:\n";
0503     std::cout << "--------------\n";
0504 
0505     checkResult(QStringLiteral("KNumber(0) ^ KNumber(0)"), KNumber(0).pow(KNumber(0)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0506     checkResult(QStringLiteral("KNumber(0) ^ KNumber(-4)"), KNumber(0).pow(KNumber(-4)), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0507     checkResult(QStringLiteral("KNumber(5) ^ KNumber(4)"), KNumber(5).pow(KNumber(4)), QStringLiteral("625"), KNumber::TYPE_INTEGER);
0508     checkResult(QStringLiteral("KNumber(122) ^ KNumber(0)"), KNumber(122).pow(KNumber(0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0509     checkResult(QStringLiteral("KNumber(-5) ^ KNumber(0)"), KNumber(-5).pow(KNumber(0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0510     checkResult(QStringLiteral("KNumber(-2) ^ KNumber(3)"), KNumber(-2).pow(KNumber(3)), QStringLiteral("-8"), KNumber::TYPE_INTEGER);
0511     checkResult(QStringLiteral("KNumber(-2) ^ KNumber(4)"), KNumber(-2).pow(KNumber(4)), QStringLiteral("16"), KNumber::TYPE_INTEGER);
0512     checkResult(QStringLiteral("KNumber(5) ^ KNumber(-2)"), KNumber(5).pow(KNumber(-2)), QStringLiteral("1/25"), KNumber::TYPE_FRACTION);
0513     checkResult(QStringLiteral("KNumber(8) ^ KNumber(\"2/3\")"), KNumber(8).pow(KNumber(QStringLiteral("2/3"))), QStringLiteral("4"), KNumber::TYPE_INTEGER);
0514     checkResult(QStringLiteral("KNumber(8) ^ KNumber(\"-2/3\")"),
0515                 KNumber(8).pow(KNumber(QStringLiteral("-2/3"))),
0516                 QStringLiteral("1/4"),
0517                 KNumber::TYPE_FRACTION);
0518 
0519     checkResult(QStringLiteral("KNumber(-16) ^ KNumber(\"1/4\")"),
0520                 KNumber(-16).pow(KNumber(QStringLiteral("1/4"))),
0521                 QStringLiteral("nan"),
0522                 KNumber::TYPE_ERROR);
0523     checkResult(QStringLiteral("KNumber(-8) ^ KNumber(\"1/3\")"), KNumber(-8).pow(KNumber(QStringLiteral("1/3"))), QStringLiteral("-2"), KNumber::TYPE_INTEGER);
0524     checkResult(QStringLiteral("KNumber(5) ^ KNumber(0.0)"), KNumber(5).pow(KNumber(0.0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0525     checkResult(QStringLiteral("KNumber(-5) ^ KNumber(0.0)"), KNumber(-5).pow(KNumber(0.0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0526 
0527     checkResult(QStringLiteral("KNumber(\"5/3\") ^ KNumber(2)"),
0528                 KNumber(QStringLiteral("5/3")).pow(KNumber(2)),
0529                 QStringLiteral("25/9"),
0530                 KNumber::TYPE_FRACTION);
0531     checkResult(QStringLiteral("KNumber(\"5/3\") ^ KNumber(0)"), KNumber(QStringLiteral("5/3")).pow(KNumber(0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0532     checkResult(QStringLiteral("KNumber(\"-5/3\") ^ KNumber(0)"), KNumber(QStringLiteral("-5/3")).pow(KNumber(0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0533     checkResult(QStringLiteral("KNumber(\"8/27\") ^ KNumber(\"2/3\")"),
0534                 KNumber(QStringLiteral("8/27")).pow(KNumber(QStringLiteral("2/3"))),
0535                 QStringLiteral("4/9"),
0536                 KNumber::TYPE_FRACTION);
0537     checkResult(QStringLiteral("KNumber(\"49/3\") ^ KNumber(\"7/9\")"),
0538                 KNumber(QStringLiteral("49/3")).pow(KNumber(QStringLiteral("7/9"))),
0539                 QStringLiteral("8.78016428243"),
0540                 KNumber::TYPE_FLOAT);
0541     checkResult(QStringLiteral("KNumber(\"5/2\") ^ KNumber(2.5)"),
0542                 KNumber(QStringLiteral("5/2")).pow(KNumber(2.5)),
0543                 QStringLiteral("9.88211768803"),
0544                 KNumber::TYPE_FLOAT);
0545     checkResult(QStringLiteral("KNumber(\"5/2\") ^ KNumber(0.0)"),
0546                 KNumber(QStringLiteral("5/2")).pow(KNumber(0.0)),
0547                 QStringLiteral("1"),
0548                 KNumber::TYPE_INTEGER);
0549     checkResult(QStringLiteral("KNumber(\"-5/2\") ^ KNumber(0.0)"),
0550                 KNumber(QStringLiteral("-5/2")).pow(KNumber(0.0)),
0551                 QStringLiteral("1"),
0552                 KNumber::TYPE_INTEGER);
0553 
0554     checkResult(QStringLiteral("KNumber(5.3) ^ KNumber(2)"), KNumber(5.3).pow(KNumber(2)), QStringLiteral("28.09"), KNumber::TYPE_FLOAT);
0555     checkResult(QStringLiteral("KNumber(5.3) ^ KNumber(0)"), KNumber(5.3).pow(KNumber(0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0556     checkResult(QStringLiteral("KNumber(-5.3) ^ KNumber(0)"), KNumber(-5.3).pow(KNumber(0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0557     checkResult(QStringLiteral("KNumber(5.3) ^ KNumber(\"2/3\")"),
0558                 KNumber(5.3).pow(KNumber(QStringLiteral("2/3"))),
0559                 QStringLiteral("3.03983898039"),
0560                 KNumber::TYPE_FLOAT);
0561     checkResult(QStringLiteral("KNumber(5.5) ^ KNumber(2.5)"), KNumber(5.5).pow(KNumber(2.5)), QStringLiteral("70.9425383673"), KNumber::TYPE_FLOAT);
0562     checkResult(QStringLiteral("KNumber(5.5) ^ KNumber(0.0)"), KNumber(5.5).pow(KNumber(0.0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0563     checkResult(QStringLiteral("KNumber(-5.5) ^ KNumber(0.0)"), KNumber(-5.5).pow(KNumber(0.0)), QStringLiteral("1"), KNumber::TYPE_INTEGER);
0564 
0565     checkResult(QStringLiteral("KNumber::Pi() ^ KNumber::Pi()"), KNumber::Pi().pow(KNumber::Pi()), QStringLiteral("36.4621596072"), KNumber::TYPE_FLOAT);
0566     checkResult(QStringLiteral("KNumber::Euler() ^ KNumber::Pi()"), KNumber::Euler().pow(KNumber::Pi()), QStringLiteral("23.1406926328"), KNumber::TYPE_FLOAT);
0567 
0568     checkResult(QStringLiteral("KNumber(2.0) ^ KNumber(0.5)"), KNumber(2.0).pow(KNumber(0.5)), QStringLiteral("1.41421356237"), KNumber::TYPE_FLOAT);
0569     checkResult(QStringLiteral("KNumber(2.0) ^ KNumber(-0.5)"), KNumber(2.0).pow(KNumber(-0.5)), QStringLiteral("0.707106781187"), KNumber::TYPE_FLOAT);
0570 
0571     checkResult(QStringLiteral("KNumber(-2.0).exp()"), KNumber(-2.0).exp(), QStringLiteral("0.135335283237"), KNumber::TYPE_FLOAT);
0572     checkResult(QStringLiteral("KNumber::Euler() ^ KNumber(-2.0)"), KNumber::Euler().pow(KNumber(-2.0)), QStringLiteral("0.135335283237"), KNumber::TYPE_FLOAT);
0573 
0574     checkResult(QStringLiteral("KNumber(2.0).exp()"), KNumber(2.0).exp(), QStringLiteral("7.38905609893"), KNumber::TYPE_FLOAT);
0575     checkResult(QStringLiteral("KNumber::Euler() ^ KNumber(2.0)"), KNumber::Euler().pow(KNumber(2.0)), QStringLiteral("7.38905609893"), KNumber::TYPE_FLOAT);
0576 
0577     // TODO: kinda odd that this ends up being an integer
0578     // i guess since my euler constant is only 100 digits, we've exceeded the fractional part
0579     checkResult(QStringLiteral("KNumber::Euler() ^ 1000"), KNumber::Euler().pow(KNumber(1000)), QStringLiteral("1.97007111402e+434"), KNumber::TYPE_INTEGER);
0580 
0581     // TODO: make this test pass
0582     // the problem is that it is using the libc exp function which has limits that GMP does not
0583     // we should basically make this equivalent to KNumber::Euler().pow(KNumber(1000))
0584     // which does work
0585 #if 0
0586     checkResult(QStringLiteral("KNumber(1000).exp()"), KNumber(1000).exp(), QLatin1String("23.1406926328"), KNumber::TYPE_FLOAT);
0587 #endif
0588 
0589     KNumber::setDefaultFractionalInput(true);
0590     checkResult(QStringLiteral("KNumber(\"3.1415926\") ^ KNumber(\"3.1415926\")"),
0591                 KNumber(QStringLiteral("3.1415926")).pow(KNumber(QStringLiteral("3.1415926"))),
0592                 QStringLiteral("36.4621554164"),
0593                 KNumber::TYPE_FLOAT);
0594     KNumber::setDefaultFractionalInput(false);
0595 }
0596 
0597 void testingInfArithmetic()
0598 {
0599     std::cout << "\n\n";
0600     std::cout << "Testing inf/nan-arithmetics:\n";
0601     std::cout << "----------------------------\n";
0602 
0603     checkResult(QStringLiteral("inf + KNumber(2)"), KNumber::PosInfinity + KNumber(2), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0604     checkResult(QStringLiteral("KNumber(-5) + inf"), KNumber(-5) + KNumber::PosInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0605     checkResult(QStringLiteral("inf + KNumber(\"1/2\")"), KNumber::PosInfinity + KNumber(QStringLiteral("1/2")), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0606     checkResult(QStringLiteral("KNumber(\"-5/3\") + inf"), KNumber(QStringLiteral("-5/3")) + KNumber::PosInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0607     checkResult(QStringLiteral("inf + KNumber(2.01)"), KNumber::PosInfinity + KNumber(2.01), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0608     checkResult(QStringLiteral("KNumber(-5.4) + inf"), KNumber(-5.4) + KNumber::PosInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0609     checkResult(QStringLiteral("-inf + KNumber(2)"), KNumber::NegInfinity + KNumber(2), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0610     checkResult(QStringLiteral("KNumber(-5) + -inf"), KNumber(-5) + KNumber::NegInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0611     checkResult(QStringLiteral("-inf + KNumber(\"1/2\")"), KNumber::NegInfinity + KNumber(QStringLiteral("1/2")), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0612     checkResult(QStringLiteral("KNumber(\"-5/3\") + -inf"),
0613                 KNumber(QStringLiteral("-5/3")) + KNumber::NegInfinity,
0614                 QStringLiteral("-inf"),
0615                 KNumber::TYPE_ERROR);
0616     checkResult(QStringLiteral("-inf + KNumber(2.01)"), KNumber::NegInfinity + KNumber(2.01), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0617     checkResult(QStringLiteral("KNumber(-5.4) + -inf"), KNumber(-5.4) + KNumber::NegInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0618     checkResult(QStringLiteral("nan + KNumber(2)"), KNumber::NaN + KNumber(2), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0619     checkResult(QStringLiteral("KNumber(-5) + nan"), KNumber(-5) + KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0620     checkResult(QStringLiteral("nan + KNumber(\"1/2\")"), KNumber::NaN + KNumber(QStringLiteral("1/2")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0621     checkResult(QStringLiteral("KNumber(\"-5/3\") + nan"), KNumber(QStringLiteral("-5/3")) + KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0622     checkResult(QStringLiteral("nan + KNumber(2.01)"), KNumber::NaN + KNumber(2.01), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0623     checkResult(QStringLiteral("KNumber(-5.4) + nan"), KNumber(-5.4) + KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0624     checkResult(QStringLiteral("inf + inf"), KNumber::PosInfinity + KNumber::PosInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0625     checkResult(QStringLiteral("inf + -inf"), KNumber::PosInfinity + KNumber::NegInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0626     checkResult(QStringLiteral("-inf + inf"), KNumber::NegInfinity + KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0627     checkResult(QStringLiteral("-inf + -inf"), KNumber::NegInfinity + KNumber::NegInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0628     checkResult(QStringLiteral("inf + nan"), KNumber::PosInfinity + KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0629     checkResult(QStringLiteral("-inf + nan"), KNumber::NegInfinity + KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0630     checkResult(QStringLiteral("nan + inf"), KNumber::NaN + KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0631     checkResult(QStringLiteral("-inf + nan"), KNumber::NegInfinity + KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0632 
0633     checkResult(QStringLiteral("inf - KNumber(2)"), KNumber::PosInfinity - KNumber(2), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0634     checkResult(QStringLiteral("KNumber(-5) - inf"), KNumber(-5) - KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0635     checkResult(QStringLiteral("inf - KNumber(\"1/2\")"), KNumber::PosInfinity - KNumber(QStringLiteral("1/2")), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0636     checkResult(QStringLiteral("KNumber(\"-5/3\") - inf"), KNumber(QStringLiteral("-5/3")) - KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0637     checkResult(QStringLiteral("inf - KNumber(2.01)"), KNumber::PosInfinity - KNumber(2.01), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0638     checkResult(QStringLiteral("KNumber(-5.4) - inf"), KNumber(-5.4) - KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0639     checkResult(QStringLiteral("-inf - KNumber(2)"), KNumber::NegInfinity - KNumber(2), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0640     checkResult(QStringLiteral("KNumber(-5) - -inf"), KNumber(-5) - KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0641     checkResult(QStringLiteral("-inf - KNumber(\"1/2\")"), KNumber::NegInfinity - KNumber(QStringLiteral("1/2")), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0642     checkResult(QStringLiteral("KNumber(\"-5/3\") - -inf"), KNumber(QStringLiteral("-5/3")) - KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0643     checkResult(QStringLiteral("-inf - KNumber(2.01)"), KNumber::NegInfinity - KNumber(2.01), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0644     checkResult(QStringLiteral("KNumber(-5.4) - -inf"), KNumber(-5.4) - KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0645     checkResult(QStringLiteral("nan - KNumber(2)"), KNumber::NaN - KNumber(2), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0646     checkResult(QStringLiteral("KNumber(-5) - nan"), KNumber(-5) - KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0647     checkResult(QStringLiteral("nan - KNumber(\"1/2\")"), KNumber::NaN - KNumber(QStringLiteral("1/2")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0648     checkResult(QStringLiteral("KNumber(\"-5/3\") - nan"), KNumber(QStringLiteral("-5/3")) - KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0649     checkResult(QStringLiteral("nan - KNumber(2.01)"), KNumber::NaN - KNumber(2.01), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0650     checkResult(QStringLiteral("KNumber(-5.4) - nan"), KNumber(-5.4) - KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0651     checkResult(QStringLiteral("inf - inf"), KNumber::PosInfinity - KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0652     checkResult(QStringLiteral("inf - -inf"), KNumber::PosInfinity - KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0653     checkResult(QStringLiteral("-inf - inf"), KNumber::NegInfinity - KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0654     checkResult(QStringLiteral("-inf - -inf"), KNumber::NegInfinity - KNumber::NegInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0655     checkResult(QStringLiteral("inf - nan"), KNumber::PosInfinity - KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0656     checkResult(QStringLiteral("-inf - nan"), KNumber::NegInfinity - KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0657     checkResult(QStringLiteral("nan - inf"), KNumber::NaN - KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0658     checkResult(QStringLiteral("-inf - nan"), KNumber::NegInfinity - KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0659 
0660     checkResult(QStringLiteral("inf * KNumber(2)"), KNumber::PosInfinity * KNumber(2), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0661     checkResult(QStringLiteral("KNumber(-5) * inf"), KNumber(-5) * KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0662     checkResult(QStringLiteral("inf * KNumber(\"1/2\")"), KNumber::PosInfinity * KNumber(QStringLiteral("1/2")), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0663     checkResult(QStringLiteral("KNumber(\"-5/3\") * inf"), KNumber(QStringLiteral("-5/3")) * KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0664     checkResult(QStringLiteral("inf * KNumber(2.01)"), KNumber::PosInfinity * KNumber(2.01), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0665     checkResult(QStringLiteral("KNumber(-5.4) * inf"), KNumber(-5.4) * KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0666     checkResult(QStringLiteral("-inf * KNumber(2)"), KNumber::NegInfinity * KNumber(2), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0667     checkResult(QStringLiteral("KNumber(-5) * -inf"), KNumber(-5) * KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0668     checkResult(QStringLiteral("-inf * KNumber(\"1/2\")"), KNumber::NegInfinity * KNumber(QStringLiteral("1/2")), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0669     checkResult(QStringLiteral("KNumber(\"-5/3\") * -inf"), KNumber(QStringLiteral("-5/3")) * KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0670     checkResult(QStringLiteral("-inf * KNumber(2.01)"), KNumber::NegInfinity * KNumber(2.01), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0671     checkResult(QStringLiteral("KNumber(-5.4) * -inf"), KNumber(-5.4) * KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0672     checkResult(QStringLiteral("nan * KNumber(2)"), KNumber::NaN * KNumber(2), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0673     checkResult(QStringLiteral("KNumber(-5) * nan"), KNumber(-5) * KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0674     checkResult(QStringLiteral("nan * KNumber(\"1/2\")"), KNumber::NaN * KNumber(QStringLiteral("1/2")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0675     checkResult(QStringLiteral("KNumber(\"-5/3\") * nan"), KNumber(QStringLiteral("-5/3")) * KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0676     checkResult(QStringLiteral("nan * KNumber(2.01)"), KNumber::NaN * KNumber(2.01), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0677     checkResult(QStringLiteral("KNumber(-5.4) * nan"), KNumber(-5.4) * KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0678     checkResult(QStringLiteral("inf * inf"), KNumber::PosInfinity * KNumber::PosInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0679     checkResult(QStringLiteral("inf * -inf"), KNumber::PosInfinity * KNumber::NegInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0680     checkResult(QStringLiteral("-inf * inf"), KNumber::NegInfinity * KNumber::PosInfinity, QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0681     checkResult(QStringLiteral("-inf * -inf"), KNumber::NegInfinity * KNumber::NegInfinity, QStringLiteral("inf"), KNumber::TYPE_ERROR);
0682     checkResult(QStringLiteral("inf * nan"), KNumber::PosInfinity * KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0683     checkResult(QStringLiteral("-inf * nan"), KNumber::NegInfinity * KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0684     checkResult(QStringLiteral("nan * inf"), KNumber::NaN * KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0685     checkResult(QStringLiteral("-inf * nan"), KNumber::NegInfinity * KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0686     checkResult(QStringLiteral("KNumber(0) * inf"), KNumber(0) * KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0687     checkResult(QStringLiteral("KNumber(0) * -inf"), KNumber(0) * KNumber::NegInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0688     checkResult(QStringLiteral("inf * KNumber(0)"), KNumber::PosInfinity * KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0689     checkResult(QStringLiteral("-inf * KNumber(0)"), KNumber::NegInfinity * KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0690     checkResult(QStringLiteral("KNumber(0.0) * inf"), KNumber(0.0) * KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0691     checkResult(QStringLiteral("KNumber(0.0) * -inf"), KNumber(0.0) * KNumber::NegInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0692     checkResult(QStringLiteral("inf * KNumber(0.0)"), KNumber::PosInfinity * KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0693     checkResult(QStringLiteral("-inf * KNumber(0.0)"), KNumber::NegInfinity * KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0694 
0695     checkResult(QStringLiteral("inf / KNumber(2)"), KNumber::PosInfinity / KNumber(2), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0696     checkResult(QStringLiteral("KNumber(-5) / inf"), KNumber(-5) / KNumber::PosInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0697     checkResult(QStringLiteral("inf / KNumber(\"1/2\")"), KNumber::PosInfinity / KNumber(QStringLiteral("1/2")), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0698     checkResult(QStringLiteral("KNumber(\"-5/3\") / inf"), KNumber(QStringLiteral("-5/3")) / KNumber::PosInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0699     checkResult(QStringLiteral("inf / KNumber(2.01)"), KNumber::PosInfinity / KNumber(2.01), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0700     checkResult(QStringLiteral("KNumber(-5.4) / inf"), KNumber(-5.4) / KNumber::PosInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0701     checkResult(QStringLiteral("-inf / KNumber(2)"), KNumber::NegInfinity / KNumber(2), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0702     checkResult(QStringLiteral("KNumber(-5) / -inf"), KNumber(-5) / KNumber::NegInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0703     checkResult(QStringLiteral("-inf / KNumber(\"1/2\")"), KNumber::NegInfinity / KNumber(QStringLiteral("1/2")), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0704     checkResult(QStringLiteral("KNumber(\"-5/3\") / -inf"), KNumber(QStringLiteral("-5/3")) / KNumber::NegInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0705     checkResult(QStringLiteral("-inf / KNumber(2.01)"), KNumber::NegInfinity / KNumber(2.01), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0706     checkResult(QStringLiteral("KNumber(-5.4) / -inf"), KNumber(-5.4) / KNumber::NegInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0707     checkResult(QStringLiteral("nan / KNumber(2)"), KNumber::NaN / KNumber(2), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0708     checkResult(QStringLiteral("KNumber(-5) / nan"), KNumber(-5) / KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0709     checkResult(QStringLiteral("nan / KNumber(\"1/2\")"), KNumber::NaN / KNumber(QStringLiteral("1/2")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0710     checkResult(QStringLiteral("KNumber(\"-5/3\") / nan"), KNumber(QStringLiteral("-5/3")) / KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0711     checkResult(QStringLiteral("nan / KNumber(2.01)"), KNumber::NaN / KNumber(2.01), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0712     checkResult(QStringLiteral("KNumber(-5.4) / nan"), KNumber(-5.4) / KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0713     checkResult(QStringLiteral("inf / inf"), KNumber::PosInfinity / KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0714     checkResult(QStringLiteral("inf / -inf"), KNumber::PosInfinity / KNumber::NegInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0715     checkResult(QStringLiteral("-inf / inf"), KNumber::NegInfinity / KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0716     checkResult(QStringLiteral("-inf / -inf"), KNumber::NegInfinity / KNumber::NegInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0717     checkResult(QStringLiteral("inf / nan"), KNumber::PosInfinity / KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0718     checkResult(QStringLiteral("-inf / nan"), KNumber::NegInfinity / KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0719     checkResult(QStringLiteral("nan / inf"), KNumber::NaN / KNumber::PosInfinity, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0720     checkResult(QStringLiteral("-inf / nan"), KNumber::NegInfinity / KNumber::NaN, QStringLiteral("nan"), KNumber::TYPE_ERROR);
0721     checkResult(QStringLiteral("KNumber(0) / inf"), KNumber(0) / KNumber::PosInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0722     checkResult(QStringLiteral("KNumber(0) / -inf"), KNumber(0) / KNumber::NegInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0723     checkResult(QStringLiteral("inf / KNumber(0)"), KNumber::PosInfinity / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0724     checkResult(QStringLiteral("-inf / KNumber(0)"), KNumber::NegInfinity / KNumber(0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0725     checkResult(QStringLiteral("KNumber(0.0) / inf"), KNumber(0.0) / KNumber::PosInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0726     checkResult(QStringLiteral("KNumber(0.0) / -inf"), KNumber(0.0) / KNumber::NegInfinity, QStringLiteral("0"), KNumber::TYPE_INTEGER);
0727     checkResult(QStringLiteral("inf / KNumber(0.0)"), KNumber::PosInfinity / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0728     checkResult(QStringLiteral("-inf / KNumber(0.0)"), KNumber::NegInfinity / KNumber(0.0), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0729 
0730     checkResult(QStringLiteral("KNumber(5) ^ KNumber(\"inf\")"), KNumber(5).pow(KNumber::PosInfinity), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0731     checkResult(QStringLiteral("KNumber(-5) ^ KNumber(\"inf\")"), KNumber(-5).pow(KNumber::PosInfinity), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0732     checkResult(QStringLiteral("KNumber(\"5/2\") ^ KNumber(\"inf\")"),
0733                 KNumber(QStringLiteral("5/2")).pow(KNumber::PosInfinity),
0734                 QStringLiteral("inf"),
0735                 KNumber::TYPE_ERROR);
0736     checkResult(QStringLiteral("KNumber(\"-5/2\") ^ KNumber(\"inf\")"),
0737                 KNumber(QStringLiteral("-5/2")).pow(KNumber::PosInfinity),
0738                 QStringLiteral("inf"),
0739                 KNumber::TYPE_ERROR);
0740     checkResult(QStringLiteral("KNumber(\"5.2\") ^ KNumber(\"inf\")"),
0741                 KNumber(QStringLiteral("5.2")).pow(KNumber::PosInfinity),
0742                 QStringLiteral("inf"),
0743                 KNumber::TYPE_ERROR);
0744     checkResult(QStringLiteral("KNumber(\"-5.2\") ^ KNumber(\"inf\")"),
0745                 KNumber(QStringLiteral("-5.2")).pow(KNumber::PosInfinity),
0746                 QStringLiteral("inf"),
0747                 KNumber::TYPE_ERROR);
0748 
0749     checkResult(QStringLiteral("KNumber(5) ^ KNumber(\"-inf\")"), KNumber(5).pow(KNumber::NegInfinity), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0750     checkResult(QStringLiteral("KNumber(-5) ^ KNumber(\"-inf\")"), KNumber(-5).pow(KNumber::NegInfinity), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0751     checkResult(QStringLiteral("KNumber(\"5/2\") ^ KNumber(\"-inf\")"),
0752                 KNumber(QStringLiteral("5/2")).pow(KNumber::NegInfinity),
0753                 QStringLiteral("0"),
0754                 KNumber::TYPE_INTEGER);
0755     checkResult(QStringLiteral("KNumber(\"-5/2\") ^ KNumber(\"-inf\")"),
0756                 KNumber(QStringLiteral("-5/2")).pow(KNumber::NegInfinity),
0757                 QStringLiteral("0"),
0758                 KNumber::TYPE_INTEGER);
0759     checkResult(QStringLiteral("KNumber(\"5.2\") ^ KNumber(\"-inf\")"),
0760                 KNumber(QStringLiteral("5.2")).pow(KNumber::NegInfinity),
0761                 QStringLiteral("0"),
0762                 KNumber::TYPE_INTEGER);
0763     checkResult(QStringLiteral("KNumber(\"-5.2\") ^ KNumber(\"-inf\")"),
0764                 KNumber(QStringLiteral("-5.2")).pow(KNumber::NegInfinity),
0765                 QStringLiteral("0"),
0766                 KNumber::TYPE_INTEGER);
0767 
0768     checkResult(QStringLiteral("KNumber(5) ^ KNumber(\"nan\")"), KNumber(5).pow(KNumber::NaN), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0769     checkResult(QStringLiteral("KNumber(-5) ^ KNumber(\"nan\")"), KNumber(-5).pow(KNumber::NaN), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0770     checkResult(QStringLiteral("KNumber(\"5/2\") ^ KNumber(\"nan\")"),
0771                 KNumber(QStringLiteral("5/2")).pow(KNumber::NaN),
0772                 QStringLiteral("nan"),
0773                 KNumber::TYPE_ERROR);
0774     checkResult(QStringLiteral("KNumber(\"-5/2\") ^ KNumber(\"nan\")"),
0775                 KNumber(QStringLiteral("-5/2")).pow(KNumber::NaN),
0776                 QStringLiteral("nan"),
0777                 KNumber::TYPE_ERROR);
0778     checkResult(QStringLiteral("KNumber(\"5.2\") ^ KNumber(\"nan\")"),
0779                 KNumber(QStringLiteral("5.2")).pow(KNumber::NaN),
0780                 QStringLiteral("nan"),
0781                 KNumber::TYPE_ERROR);
0782     checkResult(QStringLiteral("KNumber(\"-5.2\") ^ KNumber(\"nan\")"),
0783                 KNumber(QStringLiteral("-5.2")).pow(KNumber::NaN),
0784                 QStringLiteral("nan"),
0785                 KNumber::TYPE_ERROR);
0786 
0787     checkResult(QStringLiteral("KNumber(\"nan\") ^ KNumber(\"nan\")"), KNumber::NaN.pow(KNumber::NaN), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0788     checkResult(QStringLiteral("KNumber(\"nan\") ^ KNumber(\"inf\")"), KNumber::NaN.pow(KNumber::PosInfinity), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0789     checkResult(QStringLiteral("KNumber(\"nan\") ^ KNumber(\"-inf\")"), KNumber::NaN.pow(KNumber::NegInfinity), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0790 
0791     checkResult(QStringLiteral("KNumber(\"inf\") ^ KNumber(\"nan\")"), KNumber::PosInfinity.pow(KNumber::NaN), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0792     checkResult(QStringLiteral("KNumber(\"inf\") ^ KNumber(\"inf\")"),
0793                 KNumber::PosInfinity.pow(KNumber::PosInfinity),
0794                 QStringLiteral("inf"),
0795                 KNumber::TYPE_ERROR);
0796     checkResult(QStringLiteral("KNumber(\"inf\") ^ KNumber(\"-inf\")"),
0797                 KNumber::PosInfinity.pow(KNumber::NegInfinity),
0798                 QStringLiteral("0"),
0799                 KNumber::TYPE_INTEGER);
0800 
0801     checkResult(QStringLiteral("KNumber(\"-inf\") ^ KNumber(\"nan\")"), KNumber::NegInfinity.pow(KNumber::NaN), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0802     checkResult(QStringLiteral("KNumber(\"-inf\") ^ KNumber(\"inf\")"),
0803                 KNumber::NegInfinity.pow(KNumber::PosInfinity),
0804                 QStringLiteral("inf"),
0805                 KNumber::TYPE_ERROR);
0806     checkResult(QStringLiteral("KNumber(\"-inf\") ^ KNumber(\"-inf\")"),
0807                 KNumber::NegInfinity.pow(KNumber::NegInfinity),
0808                 QStringLiteral("0"),
0809                 KNumber::TYPE_INTEGER);
0810 }
0811 
0812 void testingFloatPrecision()
0813 {
0814     KNumber::setDefaultFloatPrecision(100);
0815     checkResult(QStringLiteral("Precision >= 100: (KNumber(1) + KNumber(\"1e-80\")) - KNumber(1)"),
0816                 (KNumber(1) + KNumber(QStringLiteral("1e-80"))) - KNumber(1),
0817                 QStringLiteral("1e-80"),
0818                 KNumber::TYPE_FLOAT);
0819     checkResult(QStringLiteral("Precision >= 100: (KNumber(1) + KNumber(\"1e-980\")) - KNumber(1)"),
0820                 (KNumber(1) + KNumber(QStringLiteral("1e-980"))) - KNumber(1),
0821                 QStringLiteral("0"),
0822                 KNumber::TYPE_INTEGER);
0823 
0824     KNumber::setDefaultFloatPrecision(1000);
0825     checkResult(QStringLiteral("Precision >= 1000: (KNumber(1) + KNumber(\"1e-980\")) - KNumber(1)"),
0826                 (KNumber(1) + KNumber(QStringLiteral("1e-980"))) - KNumber(1),
0827                 QStringLiteral("1e-980"),
0828                 KNumber::TYPE_FLOAT);
0829 
0830     KNumber::setDefaultFloatPrecision(20);
0831     checkResult(QStringLiteral("Precision >= 20: sin(KNumber(30))"),
0832                 sin(KNumber(30) * (KNumber::Pi() / KNumber(180))),
0833                 QStringLiteral("0.5"),
0834                 KNumber::TYPE_FLOAT);
0835 }
0836 
0837 void testingOutput()
0838 {
0839     KNumber::setDefaultFloatOutput(false);
0840     checkResult(QStringLiteral("Fractional output: KNumber(\"1/4\")"), KNumber(QStringLiteral("1/4")), QStringLiteral("1/4"), KNumber::TYPE_FRACTION);
0841 
0842     KNumber::setDefaultFloatOutput(true);
0843     checkResult(QStringLiteral("Float: KNumber(\"1/4\")"), KNumber(QStringLiteral("1/4")), QStringLiteral("0.25"), KNumber::TYPE_FRACTION);
0844 
0845     KNumber::setDefaultFloatOutput(false);
0846     KNumber::setSplitoffIntegerForFractionOutput(true);
0847     checkResult(QStringLiteral("Fractional output: KNumber(\"1/4\")"), KNumber(QStringLiteral("1/4")), QStringLiteral("1/4"), KNumber::TYPE_FRACTION);
0848     checkResult(QStringLiteral("Fractional output: KNumber(\"-1/4\")"), KNumber(QStringLiteral("-1/4")), QStringLiteral("-1/4"), KNumber::TYPE_FRACTION);
0849     checkResult(QStringLiteral("Fractional output: KNumber(\"21/4\")"), KNumber(QStringLiteral("21/4")), QStringLiteral("5 1/4"), KNumber::TYPE_FRACTION);
0850     checkResult(QStringLiteral("Fractional output: KNumber(\"-21/4\")"), KNumber(QStringLiteral("-21/4")), QStringLiteral("-5 1/4"), KNumber::TYPE_FRACTION);
0851 
0852     KNumber::setSplitoffIntegerForFractionOutput(false);
0853     checkResult(QStringLiteral("Fractional output: KNumber(\"1/4\")"), KNumber(QStringLiteral("1/4")), QStringLiteral("1/4"), KNumber::TYPE_FRACTION);
0854     checkResult(QStringLiteral("Fractional output: KNumber(\"-1/4\")"), KNumber(QStringLiteral("-1/4")), QStringLiteral("-1/4"), KNumber::TYPE_FRACTION);
0855     checkResult(QStringLiteral("Fractional output: KNumber(\"21/4\")"), KNumber(QStringLiteral("21/4")), QStringLiteral("21/4"), KNumber::TYPE_FRACTION);
0856     checkResult(QStringLiteral("Fractional output: KNumber(\"-21/4\")"), KNumber(QStringLiteral("-21/4")), QStringLiteral("-21/4"), KNumber::TYPE_FRACTION);
0857 }
0858 
0859 void testingConstructors()
0860 {
0861     std::cout << "Testing Constructors:\n";
0862     std::cout << "---------------------\n";
0863 
0864     checkResult(QStringLiteral("KNumber(5)"), KNumber(5), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0865     checkType(QStringLiteral("KNumber(5.3)"), KNumber(5.3).type(), KNumber::TYPE_FLOAT);
0866     checkType(QStringLiteral("KNumber(0.0)"), KNumber(0.0).type(), KNumber::TYPE_INTEGER);
0867 
0868     checkResult(QStringLiteral("KNumber(\"5\")"), KNumber(QStringLiteral("5")), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0869     checkResult(QStringLiteral("KNumber(\"5/3\")"), KNumber(QStringLiteral("5/3")), QStringLiteral("5/3"), KNumber::TYPE_FRACTION);
0870     checkResult(QStringLiteral("KNumber(\"5/1\")"), KNumber(QStringLiteral("5/1")), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0871     checkResult(QStringLiteral("KNumber(\"0/12\")"), KNumber(QStringLiteral("0/12")), QStringLiteral("0"), KNumber::TYPE_INTEGER);
0872     KNumber::setDefaultFractionalInput(true);
0873     std::cout << "Read decimals as fractions:\n";
0874     checkResult(QStringLiteral("KNumber(\"5\")"), KNumber(QStringLiteral("5")), QStringLiteral("5"), KNumber::TYPE_INTEGER);
0875     checkResult(QStringLiteral("KNumber(\"1.2\")"), KNumber(QStringLiteral("1.2")), QStringLiteral("6/5"), KNumber::TYPE_FRACTION);
0876     checkResult(QStringLiteral("KNumber(\"-0.02\")"), KNumber(QStringLiteral("-0.02")), QStringLiteral("-1/50"), KNumber::TYPE_FRACTION);
0877     checkResult(QStringLiteral("KNumber(\"5e-2\")"), KNumber(QStringLiteral("5e-2")), QStringLiteral("1/20"), KNumber::TYPE_FRACTION);
0878     checkResult(QStringLiteral("KNumber(\"1.2e3\")"), KNumber(QStringLiteral("1.2e3")), QStringLiteral("1200"), KNumber::TYPE_INTEGER);
0879     checkResult(QStringLiteral("KNumber(\"0.02e+1\")"), KNumber(QStringLiteral("0.02e+1")), QStringLiteral("1/5"), KNumber::TYPE_FRACTION);
0880 
0881     KNumber::setDefaultFractionalInput(false);
0882     std::cout << "Read decimals as floats:\n";
0883     checkResult(QStringLiteral("KNumber(\"5.3\")"), KNumber(QStringLiteral("5.3")), QStringLiteral("5.3"), KNumber::TYPE_FLOAT);
0884 
0885     checkResult(QStringLiteral("KNumber(\"nan\")"), KNumber(QStringLiteral("nan")), QStringLiteral("nan"), KNumber::TYPE_ERROR);
0886     checkResult(QStringLiteral("KNumber(\"inf\")"), KNumber(QStringLiteral("inf")), QStringLiteral("inf"), KNumber::TYPE_ERROR);
0887     checkResult(QStringLiteral("KNumber(\"-inf\")"), KNumber(QStringLiteral("-inf")), QStringLiteral("-inf"), KNumber::TYPE_ERROR);
0888 
0889     // test accepting of non-US number formatted strings
0890     KNumber::setDecimalSeparator(QStringLiteral(","));
0891     checkResult(QStringLiteral("KNumber(\"5,2\")"), KNumber(QStringLiteral("5,2")), QStringLiteral("5.2"), KNumber::TYPE_FLOAT);
0892     KNumber::setDecimalSeparator(QStringLiteral("."));
0893 }
0894 
0895 void testingConstants()
0896 {
0897     std::cout << "\n\n";
0898     std::cout << "Constants:\n";
0899     std::cout << "----------\n";
0900 
0901     checkType(QStringLiteral("KNumber::Zero"), KNumber::Zero.type(), KNumber::TYPE_INTEGER);
0902     checkType(QStringLiteral("KNumber::One"), KNumber::One.type(), KNumber::TYPE_INTEGER);
0903     checkType(QStringLiteral("KNumber::NegOne"), KNumber::NegOne.type(), KNumber::TYPE_INTEGER);
0904     checkType(QStringLiteral("KNumber::Pi"), KNumber::Pi().type(), KNumber::TYPE_FLOAT);
0905     checkType(QStringLiteral("KNumber::Euler"), KNumber::Euler().type(), KNumber::TYPE_FLOAT);
0906 }
0907 
0908 void testingRound()
0909 {
0910     std::cout << "\n\n";
0911     std::cout << "Testing rounding numbers to precision=2:\n";
0912     std::cout << "----------\n";
0913 
0914     checkTruth(QStringLiteral("KNumber(3)     -> 3.00"), KNumber(QStringLiteral("3")).toQString(-1, 2) == QStringLiteral("3.00"), true);
0915     checkTruth(QStringLiteral("KNumber(3.)    -> 3.00"), KNumber(QStringLiteral("3.")).toQString(-1, 2) == QStringLiteral("3.00"), true);
0916     checkTruth(QStringLiteral("KNumber(3.0)   -> 3.00"), KNumber(QStringLiteral("3.0")).toQString(-1, 2) == QStringLiteral("3.00"), true);
0917     checkTruth(QStringLiteral("KNumber(3.00)  -> 3.00"), KNumber(QStringLiteral("3.00")).toQString(-1, 2) == QStringLiteral("3.00"), true);
0918     checkTruth(QStringLiteral("KNumber(3.02)  -> 3.02"), KNumber(QStringLiteral("3.02")).toQString(-1, 2) == QStringLiteral("3.02"), true);
0919     checkTruth(QStringLiteral("KNumber(3.09)  -> 3.09"), KNumber(QStringLiteral("3.09")).toQString(-1, 2) == QStringLiteral("3.09"), true);
0920     checkTruth(QStringLiteral("KNumber(3.001) -> 3.00"), KNumber(QStringLiteral("3.001")).toQString(-1, 2) == QStringLiteral("3.00"), true);
0921     checkTruth(QStringLiteral("KNumber(3.005) -> 3.01"), KNumber(QStringLiteral("3.005")).toQString(-1, 2) == QStringLiteral("3.01"), true);
0922     checkTruth(QStringLiteral("KNumber(3.091) -> 3.09"), KNumber(QStringLiteral("3.091")).toQString(-1, 2) == QStringLiteral("3.09"), true);
0923     checkTruth(QStringLiteral("KNumber(3.099) -> 3.10"), KNumber(QStringLiteral("3.099")).toQString(-1, 2) == QStringLiteral("3.10"), true);
0924     checkTruth(QStringLiteral("KNumber(3.999) -> 4.00"), KNumber(QStringLiteral("3.999")).toQString(-1, 2) == QStringLiteral("4.00"), true);
0925     checkTruth(QStringLiteral("KNumber(3.9099)-> 3.91"), KNumber(QStringLiteral("3.9099")).toQString(-1, 2) == QStringLiteral("3.91"), true);
0926     checkTruth(QStringLiteral("KNumber(9.999) -> 10.00"), KNumber(QStringLiteral("9.999")).toQString(-1, 2) == QStringLiteral("10.00"), true);
0927 }
0928 }
0929 
0930 int main()
0931 {
0932     testingConstants();
0933     testingConstructors();
0934     testingCompare();
0935     testingAdditions();
0936     testingSubtractions();
0937     testingMultiplications();
0938     testingDivisions();
0939     testingAndOr();
0940     testingModulus();
0941     testingAbs();
0942     testingSqrt();
0943     testingFactorial();
0944     testingComplement();
0945     testingPower();
0946     testingTruncateToInteger();
0947     testingShifts();
0948     testingInfArithmetic();
0949     testingFloatPrecision();
0950     testingTrig();
0951     testingSpecial();
0952     testingOutput();
0953     testingRound();
0954     std::cout << "SUCCESS" << std::endl;
0955 }