Steppable 0.0.1
A CAS project written from scratch in C++
Loading...
Searching...
No Matches
calc.hpp
1/**************************************************************************************************
2 * Copyright (c) 2023-2025 NWSOFT *
3 * *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy *
5 * of this software and associated documentation files (the "Software"), to deal *
6 * in the Software without restriction, including without limitation the rights *
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell *
8 * copies of the Software, and to permit persons to whom the Software is *
9 * furnished to do so, subject to the following conditions: *
10 * *
11 * The above copyright notice and this permission notice shall be included in all *
12 * copies or substantial portions of the Software. *
13 * *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR *
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE *
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER *
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, *
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE *
20 * SOFTWARE. *
21 **************************************************************************************************/
22
35
36#pragma once
37
38#include "fn/root.hpp"
39#include "output.hpp"
40#include "steppable/number.hpp"
41#include "types/result.hpp"
42
43#include <string>
44#include <util.hpp>
45
46using namespace std::literals;
47
53{
58 {
59 std::string quotient;
60 std::string remainder;
61 };
62
70 std::string abs(const std::string& _number, int steps);
71
83 std::string add(const std::string& a,
84 const std::string& b,
85 int steps = 2,
86 bool negative = false,
87 bool properlyFormat = true);
88
100 std::string compare(const std::string& _a, const std::string& _b, int steps = 2);
101
110 std::string decimalConvert(const std::string& _inputString, const std::string& baseString, int steps = 2);
111
120 std::string baseConvert(const std::string& _number, const std::string& baseStr, int steps = 2);
121
131 std::string divide(const std::string& number, const std::string& divisor, int steps = 2, int decimals = 5);
132
140 QuotientRemainder divideWithQuotient(const std::string& number, const std::string& divisor);
141
150 std::string getGCD(const std::string& _a, const std::string& _b);
151
160 std::string multiply(const std::string& a, const std::string& b, int steps = 2, int decimals = MAX_DECIMALS);
161
171 std::string power(const std::string& _number, const std::string& raiseTo, int steps = 2, int decimals = 8);
172
180 std::string exp(const std::string& x, size_t decimals = 10);
181
191 std::string subtract(const std::string& a, const std::string& b, int steps = 2, bool noMinus = false);
192
202 types::Result<Number> error(const std::string& a, const std::string& b);
203
214 std::string root(const std::string& _number, const std::string& base, size_t decimals = 8, int steps = 0);
215
223 Surd rootSurd(const std::string& _number, const std::string& base);
224
233 std::string rootIntPart(const std::string& _number, const std::string& base);
234
243 std::string factorial(const std::string& _number, int steps = 2);
244
251 std::string degToRad(const std::string& _deg);
252
259 std::string gradToRad(const std::string& _grad);
260
270 std::string cos(const std::string& x, int decimals, int mode = 0);
271
281 std::string sin(const std::string& x, int decimals, int mode = 0);
282
292 std::string tan(const std::string& x, int decimals, int mode = 0);
293
303 std::string sec(const std::string& x, int decimals, int mode = 0);
304
314 std::string csc(const std::string& x, int decimals, int mode = 0);
315
325 std::string cot(const std::string& x, int decimals, int mode = 0);
326
336 std::string acos(const std::string& x, int decimals, int mode = 0);
337
347 std::string asin(const std::string& x, int decimals, int mode = 0);
348
358 std::string atan(const std::string& x, int decimals, int mode = 0);
359
369 std::string asec(const std::string& x, int decimals, int mode = 0);
370
380 std::string acsc(const std::string& x, int decimals, int mode = 0);
381
391 std::string acot(const std::string& x, int decimals, int mode = 0);
392
401 std::string sinh(const std::string& x, int decimals);
402
411 std::string cosh(const std::string& x, int decimals);
412
421 std::string tanh(const std::string& x, int decimals);
422
431 std::string sech(const std::string& x, int decimals);
432
441 std::string csch(const std::string& x, int decimals);
442
451 std::string coth(const std::string& x, int decimals);
452
461 std::string asinh(const std::string& x, int decimals);
462
471 std::string acosh(const std::string& x, int decimals);
472
481 std::string atanh(const std::string& x, int decimals);
482
491 std::string acoth(const std::string& x, int decimals);
492
501 std::string asech(const std::string& x, int decimals);
502
511 std::string acsch(const std::string& x, int decimals);
512
521 std::string logb(const std::string& _number, const std::string& _base, size_t _decimals);
522
532 std::string log10(const std::string& _number, size_t _decimals);
533
543 std::string log2(const std::string& _number, size_t _decimals);
544
554 std::string ln(const std::string& _number, size_t _decimals);
555
562 template<typename Pred>
563 void loop(const std::string& times, Pred predicate)
564 {
565 // We're done already!
566 if (times == "0")
567 return;
568 if (times == "1")
569 return predicate("1");
570
571 std::string current = "0";
572 auto result = compare(current, times, 0);
573
574 while (result == "0")
575 {
576 try
577 {
578 predicate(current);
579 }
580 catch (std::exception& e)
581 {
582 output::error("loop", "Exception occurred in predicate."s);
583 output::error("loop", "Exception message: {0}"s, { e.what() });
584 }
585 current = add(current, "1", 0);
586 result = compare(current, times, 0);
587 }
588 }
589
590} // namespace steppable::__internals::calc
The namespace containing number calculating functions for the Steppable library.
Definition baseConvert.cpp:66
std::string degToRad(const std::string &_deg)
Converts degrees to radians.
Definition trig.cpp:52
std::string log10(const std::string &_number, const size_t _decimals)
Calculates the common logarithm of a number.
Definition log.cpp:125
std::string factorial(const std::string &_number, const int steps)
Calculates the factorial of a number.
Definition factorial.cpp:51
std::string subtract(const std::string &a, const std::string &b, const int steps, const bool noMinus)
Subtracts one string representation of a number from another string representation of a number.
Definition subtract.cpp:54
std::string coth(const std::string &x, const int decimals)
Hyperbolic tangent function.
Definition hyp.cpp:90
std::string rootIntPart(const std::string &_number, const std::string &base)
Gets the integer part of the root of a number.
Definition root.cpp:92
std::string acot(const std::string &x, const int decimals, const int mode)
Calculates the arc cotangent of a number.
Definition trig.cpp:465
void loop(const std::string &times, Pred predicate)
Executes a given predicate function a specified number of times.
Definition calc.hpp:563
std::string compare(const std::string &_a, const std::string &_b, const int steps)
Compares two string representations of numbers.
Definition comparison.cpp:49
types::Result< Number > error(const std::string &a, const std::string &b)
Calculate the error between values a and b.
Definition subtract.cpp:190
std::string gradToRad(const std::string &_grad)
Converts gradians to radians.
Definition trig.cpp:60
std::string multiply(const std::string &_a, const std::string &_b, const int steps, const int decimals)
Multiplies two string representations of numbers.
Definition multiply.cpp:51
std::string sech(const std::string &x, const int decimals)
Hyperbolic tangent function.
Definition hyp.cpp:118
std::string cosh(const std::string &x, const int decimals)
Hyperbolic cosine function.
Definition hyp.cpp:66
std::string power(const std::string &_number, const std::string &_raiseTo, const int steps, const int decimals)
Raises a string representation of a number to a power.
Definition power.cpp:62
std::string csch(const std::string &x, const int decimals)
Hyperbolic tangent function.
Definition hyp.cpp:104
std::string ln(const std::string &_number, const size_t _decimals)
Calculates the natural logarithm of a number.
Definition log.cpp:137
std::string sinh(const std::string &x, const int decimals)
Hyperbolic sine function.
Definition hyp.cpp:52
std::string sin(const std::string &x, const int decimals, const int mode)
Calculates the sine of a number.
Definition trig.cpp:176
std::string cos(const std::string &x, const int decimals, const int mode)
Calculates the cosine of a number.
Definition trig.cpp:140
std::string divide(const std::string &_number, const std::string &_divisor, const int steps, const int _decimals)
Divides a string representation of a number by another string representation of a number.
Definition division.cpp:117
std::string logb(const std::string &_number, const std::string &_base, const size_t _decimals)
Calculates the logarithm with a given base.
Definition log.cpp:107
std::string tan(const std::string &x, const int decimals, const int mode)
Calculates the tangent of a number.
Definition trig.cpp:215
std::string acosh(const std::string &x, const int decimals)
Inverse hyperbolic cosine function.
Definition hyp.cpp:147
QuotientRemainder divideWithQuotient(const std::string &number, const std::string &divisor)
Definition division.cpp:276
std::string csc(const std::string &x, const int decimals, const int mode)
Calculates the cosecant of a number.
Definition trig.cpp:271
std::string add(const std::string &a, const std::string &b, const int steps, const bool negative, const bool properlyFormat)
Adds two string representations of numbers, and performs with the column method.
Definition add.cpp:50
std::string log2(const std::string &_number, const size_t _decimals)
Calculates the binary logarithm of a number.
Definition log.cpp:131
std::string getGCD(const std::string &_a, const std::string &_b)
Gets the greatest common divisor of two string representations of numbers.
Definition division.cpp:288
std::string decimalConvert(const std::string &_inputString, const std::string &baseString, int steps)
Converts a string representation of a number from any base to decimal.
Definition decimalConvert.cpp:67
std::string baseConvert(const std::string &_number, const std::string &baseStr, const int steps)
Converts a string representation of a number from decimal to another one.
Definition baseConvert.cpp:87
std::string acoth(const std::string &x, const int decimals)
Inverse hyperbolic cotangent function.
Definition hyp.cpp:177
std::string atan(const std::string &_x, const int decimals, const int mode)
Calculates the arc tangent of a number.
Definition trig.cpp:310
std::string asec(const std::string &x, const int decimals, const int mode)
Calculates the arc secant of a number.
Definition trig.cpp:433
Surd rootSurd(const std::string &_number, const std::string &base)
Converts a root operation into a surd.
Definition root.cpp:119
std::string acsch(const std::string &x, const int decimals)
Inverse hyperbolic cosecant function.
Definition hyp.cpp:192
std::string cot(const std::string &x, const int decimals, const int mode)
Calculates the cotangent of a number.
Definition trig.cpp:297
std::string tanh(const std::string &x, const int decimals)
Hyperbolic tangent function.
Definition hyp.cpp:80
std::string atanh(const std::string &x, const int decimals)
Inverse hyperbolic tangent function.
Definition hyp.cpp:162
std::string root(const std::string &_number, const std::string &base, const size_t _decimals, const int steps)
Takes the n-th root of a numer.
Definition root.cpp:189
std::string asin(const std::string &x, const int decimals, const int mode)
Calculates the arc sine of a number.
Definition trig.cpp:365
std::string acos(const std::string &x, const int decimals, const int mode)
Calculates the arc cosine of a number.
Definition trig.cpp:407
std::string asech(const std::string &x, const int decimals)
Inverse hyperbolic secant function.
Definition hyp.cpp:212
std::string abs(const std::string &_number, const int steps)
Calculates the absolute value of a string representation of a number.
Definition abs.cpp:56
std::string acsc(const std::string &x, const int decimals, const int mode)
Calculates the arc cosecant of a number.
Definition trig.cpp:449
std::string exp(const std::string &x, const size_t decimals)
Calculates e^x. Shorthand of power(x, E, 0);.
Definition power.cpp:145
std::string sec(const std::string &x, const int decimals, const int mode)
Calculates the secant of a number.
Definition trig.cpp:284
std::string asinh(const std::string &x, const int decimals)
Inverse hyperbolic sine function.
Definition hyp.cpp:132
void error(const std::string &name, const std::basic_string< T > &msg, const std::vector< std::string > &args={})
Prints an error message.
Definition output.hpp:80
ResultBase< Status, ResultT, StringLiteral{ "str" }> Result
An alias for a result of a calculation. This represents a calculation with a Status status.
Definition result.hpp:127
Represents the quotient and remainder of a division operation.
Definition calc.hpp:58
std::string quotient
Definition calc.hpp:59
std::string remainder
Definition calc.hpp:60
A struct to represent a surd. A surd is a number that cannot be simplified to remove a square root....
Definition root.hpp:38
Untitled