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 }