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"