File indexing completed on 2024-05-12 16:35:35
0001 /* This file is part of the KDE project 0002 Copyright (C) 1998-2002 The KSpread Team <calligra-devel@kde.org> 0003 Copyright (C) 2005 Tomas Mecir <mecirt@gmail.com> 0004 0005 This library is free software; you can redistribute it and/or 0006 modify it under the terms of the GNU Library General Public 0007 License as published by the Free Software Foundation; only 0008 version 2 of the License. 0009 0010 This library is distributed in the hope that it will be useful, 0011 but WITHOUT ANY WARRANTY; without even the implied warranty of 0012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 0013 Library General Public License for more details. 0014 0015 You should have received a copy of the GNU Library General Public License 0016 along with this library; see the file COPYING.LIB. If not, write to 0017 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 0018 Boston, MA 02110-1301, USA. 0019 */ 0020 0021 // built-in trigonometric functions 0022 #include "TrigonometryModule.h" 0023 0024 #include "Function.h" 0025 #include "FunctionModuleRegistry.h" 0026 #include "ValueCalc.h" 0027 0028 using namespace Calligra::Sheets; 0029 0030 // prototypes (sort alphabetically) 0031 Value func_acos(valVector args, ValueCalc *calc, FuncExtra *); 0032 Value func_acosh(valVector args, ValueCalc *calc, FuncExtra *); 0033 Value func_acot(valVector args, ValueCalc *calc, FuncExtra *); 0034 Value func_acoth(valVector args, ValueCalc *calc, FuncExtra *); 0035 Value func_asinh(valVector args, ValueCalc *calc, FuncExtra *); 0036 Value func_asin(valVector args, ValueCalc *calc, FuncExtra *); 0037 Value func_atan(valVector args, ValueCalc *calc, FuncExtra *); 0038 Value func_atan2(valVector args, ValueCalc *calc, FuncExtra *); 0039 Value func_atanh(valVector args, ValueCalc *calc, FuncExtra *); 0040 Value func_cos(valVector args, ValueCalc *calc, FuncExtra *); 0041 Value func_cosh(valVector args, ValueCalc *calc, FuncExtra *); 0042 Value func_cot(valVector args, ValueCalc *calc, FuncExtra *); 0043 Value func_coth(valVector args, ValueCalc *calc, FuncExtra *); 0044 Value func_csc(valVector args, ValueCalc *calc, FuncExtra *); 0045 Value func_csch(valVector args, ValueCalc *calc, FuncExtra *); 0046 Value func_degrees(valVector args, ValueCalc *calc, FuncExtra *); 0047 Value func_radians(valVector args, ValueCalc *calc, FuncExtra *); 0048 Value func_sec(valVector args, ValueCalc *calc, FuncExtra *); 0049 Value func_sech(valVector args, ValueCalc *calc, FuncExtra *); 0050 Value func_sin(valVector args, ValueCalc *calc, FuncExtra *); 0051 Value func_sinh(valVector args, ValueCalc *calc, FuncExtra *); 0052 Value func_tan(valVector args, ValueCalc *calc, FuncExtra *); 0053 Value func_tanh(valVector args, ValueCalc *calc, FuncExtra *); 0054 Value func_pi(valVector args, ValueCalc *calc, FuncExtra *); 0055 0056 0057 CALLIGRA_SHEETS_EXPORT_FUNCTION_MODULE("kspreadtrigonometrymodule.json", TrigonometryModule) 0058 0059 0060 TrigonometryModule::TrigonometryModule(QObject* parent, const QVariantList&) 0061 : FunctionModule(parent) 0062 { 0063 Function *f; 0064 0065 f = new Function("ACOS", func_acos); 0066 add(f); 0067 f = new Function("ACOSH", func_acosh); 0068 add(f); 0069 f = new Function("ACOT", func_acot); 0070 add(f); 0071 f = new Function("ACOTH", func_acoth); 0072 add(f); 0073 f = new Function("ASIN", func_asin); 0074 add(f); 0075 f = new Function("ASINH", func_asinh); 0076 add(f); 0077 f = new Function("ATAN", func_atan); 0078 add(f); 0079 f = new Function("ATAN2", func_atan2); 0080 f->setParamCount(2); 0081 add(f); 0082 f = new Function("ATANH", func_atanh); 0083 add(f); 0084 f = new Function("COS", func_cos); 0085 add(f); 0086 f = new Function("COSH", func_cosh); 0087 add(f); 0088 f = new Function("COT", func_cot); 0089 add(f); 0090 f = new Function("COTH", func_coth); 0091 add(f); 0092 f = new Function("CSC", func_csc); 0093 add(f); 0094 f = new Function("CSCH", func_csch); 0095 add(f); 0096 f = new Function("DEGREES", func_degrees); 0097 add(f); 0098 f = new Function("RADIANS", func_radians); 0099 add(f); 0100 f = new Function("SEC", func_sec); 0101 add(f); 0102 f = new Function("SECH", func_sech); 0103 add(f); 0104 f = new Function("SIN", func_sin); 0105 add(f); 0106 f = new Function("SINH", func_sinh); 0107 add(f); 0108 f = new Function("TAN", func_tan); 0109 add(f); 0110 f = new Function("TANH", func_tanh); 0111 add(f); 0112 f = new Function("PI", func_pi); 0113 f->setParamCount(0); 0114 add(f); 0115 } 0116 0117 QString TrigonometryModule::descriptionFileName() const 0118 { 0119 return QString("trig.xml"); 0120 } 0121 0122 0123 // Function: sin 0124 Value func_sin(valVector args, ValueCalc *calc, FuncExtra *) 0125 { 0126 return calc->sin(args[0]); 0127 } 0128 0129 // Function: cos 0130 Value func_cos(valVector args, ValueCalc *calc, FuncExtra *) 0131 { 0132 return calc->cos(args[0]); 0133 } 0134 0135 // Function: tan 0136 Value func_tan(valVector args, ValueCalc *calc, FuncExtra *) 0137 { 0138 return calc->tg(args[0]); 0139 } 0140 0141 // Function: atan 0142 Value func_atan(valVector args, ValueCalc *calc, FuncExtra *) 0143 { 0144 return calc->atg(args[0]); 0145 } 0146 0147 // Function: asin 0148 Value func_asin(valVector args, ValueCalc *calc, FuncExtra *) 0149 { 0150 return calc->asin(args[0]); 0151 } 0152 0153 // Function: acos 0154 Value func_acos(valVector args, ValueCalc *calc, FuncExtra *) 0155 { 0156 return calc->acos(args[0]); 0157 } 0158 0159 Value func_acot(valVector args, ValueCalc *calc, FuncExtra *) 0160 { 0161 // PI/2 - atg (val) 0162 return calc->sub(calc->div(calc->pi(), 2), calc->atg(args[0])); 0163 } 0164 0165 // function: ACOTH 0166 Value func_acoth(valVector args, ValueCalc *calc, FuncExtra *) 0167 { 0168 if (calc->lower(calc->abs(args[0]), Value(1.0))) 0169 return Value::errorNUM(); 0170 0171 return calc->mul(Value(0.5), calc->ln(calc->div(calc->add(args[0], Value(1.0)) , calc->sub(args[0], Value(1.0))))); 0172 } 0173 0174 // Function: asinh 0175 Value func_asinh(valVector args, ValueCalc *calc, FuncExtra *) 0176 { 0177 return calc->asinh(args[0]); 0178 } 0179 0180 // Function: acosh 0181 Value func_acosh(valVector args, ValueCalc *calc, FuncExtra *) 0182 { 0183 return calc->acosh(args[0]); 0184 } 0185 0186 // Function: atanh 0187 Value func_atanh(valVector args, ValueCalc *calc, FuncExtra *) 0188 { 0189 return calc->atgh(args[0]); 0190 } 0191 0192 // Function: tanh 0193 Value func_tanh(valVector args, ValueCalc *calc, FuncExtra *) 0194 { 0195 return calc->tgh(args[0]); 0196 } 0197 0198 // Function: sinh 0199 Value func_sinh(valVector args, ValueCalc *calc, FuncExtra *) 0200 { 0201 return calc->sinh(args[0]); 0202 } 0203 0204 // Function: cosh 0205 Value func_cosh(valVector args, ValueCalc *calc, FuncExtra *) 0206 { 0207 return calc->cosh(args[0]); 0208 } 0209 0210 // Function: cot 0211 Value func_cot(valVector args, ValueCalc *calc, FuncExtra *) 0212 { 0213 return calc->div(1, calc->tg(args[0])); 0214 } 0215 0216 // Function: coth 0217 Value func_coth(valVector args, ValueCalc *calc, FuncExtra *) 0218 { 0219 if (calc->isZero(args[0])) 0220 return Value::errorNUM(); 0221 0222 return calc->div(1, calc->tgh(args[0])); 0223 } 0224 0225 // Function: csc 0226 Value func_csc(valVector args, ValueCalc *calc, FuncExtra *) 0227 { 0228 return calc->div(1, calc->sin(args[0])); 0229 } 0230 0231 // Function: csch 0232 Value func_csch(valVector args, ValueCalc *calc, FuncExtra *) 0233 { 0234 return calc->div(1, calc->sinh(args[0])); 0235 } 0236 0237 // Function: sec 0238 Value func_sec(valVector args, ValueCalc *calc, FuncExtra *) 0239 { 0240 return calc->div(1, calc->cos(args[0])); 0241 } 0242 0243 // Function: sech 0244 Value func_sech(valVector args, ValueCalc *calc, FuncExtra *) 0245 { 0246 return calc->div(1, calc->cosh(args[0])); 0247 } 0248 0249 // Function: DEGREES 0250 Value func_degrees(valVector args, ValueCalc *calc, FuncExtra *) 0251 { 0252 // val * 180 / pi 0253 return calc->div(calc->mul(args[0], 180.0), calc->pi()); 0254 } 0255 0256 // Function: RADIANS 0257 Value func_radians(valVector args, ValueCalc *calc, FuncExtra *) 0258 { 0259 // val * pi / 180 0260 return calc->mul(calc->div(args[0], 180.0), calc->pi()); 0261 } 0262 0263 // Function: PI 0264 Value func_pi(valVector, ValueCalc *calc, FuncExtra *) 0265 { 0266 return calc->pi(); 0267 } 0268 0269 // Function: atan2 0270 Value func_atan2(valVector args, ValueCalc *calc, FuncExtra *) 0271 { 0272 return calc->atan2(args[1], args[0]); 0273 } 0274 0275 #include "trig.moc"