nk 1.0.0
C++ Numerical Computing Runtime
Loading...
Searching...
No Matches
elfun.hpp
Go to the documentation of this file.
1// include/nk/builtin/elfun.hpp
2//
3// Elementary mathematical functions: trigonometry, exp, log, complex, rounding.
4#pragma once
5
6#include <memory_resource>
7#include <nk/value/value.hpp>
8#include <nk/value/span.hpp>
9
10namespace nk::builtin {
11
14
15
22
23// ── Trigonometry (Radians) ──────────────────────────────────────────────────
24
34Value sin(const Value &x, std::pmr::memory_resource *mr = nullptr);
35
45Value cos(const Value &x, std::pmr::memory_resource *mr = nullptr);
46
55Value tan(const Value &x, std::pmr::memory_resource *mr = nullptr);
56
66Value asin(const Value &x, std::pmr::memory_resource *mr = nullptr);
67
77Value acos(const Value &x, std::pmr::memory_resource *mr = nullptr);
78
87Value atan(const Value &x, std::pmr::memory_resource *mr = nullptr);
88
99Value atan2(const Value &y, const Value &x, std::pmr::memory_resource *mr = nullptr);
100
107Value sec(const Value &x, std::pmr::memory_resource *mr = nullptr);
108
115Value csc(const Value &x, std::pmr::memory_resource *mr = nullptr);
116
123Value cot(const Value &x, std::pmr::memory_resource *mr = nullptr);
124
131Value asec(const Value &x, std::pmr::memory_resource *mr = nullptr);
132
139Value acsc(const Value &x, std::pmr::memory_resource *mr = nullptr);
140
147Value acot(const Value &x, std::pmr::memory_resource *mr = nullptr);
148
149// ── Trigonometry (Degrees) ──────────────────────────────────────────────────
150
159Value sind(const Value &x, std::pmr::memory_resource *mr = nullptr);
160
169Value cosd(const Value &x, std::pmr::memory_resource *mr = nullptr);
170
179Value tand(const Value &x, std::pmr::memory_resource *mr = nullptr);
180
189Value asind(const Value &x, std::pmr::memory_resource *mr = nullptr);
190
199Value acosd(const Value &x, std::pmr::memory_resource *mr = nullptr);
200
209Value atand(const Value &x, std::pmr::memory_resource *mr = nullptr);
210
220Value atan2d(const Value &y, const Value &x, std::pmr::memory_resource *mr = nullptr);
221
228Value secd(const Value &x, std::pmr::memory_resource *mr = nullptr);
229
236Value cscd(const Value &x, std::pmr::memory_resource *mr = nullptr);
237
244Value cotd(const Value &x, std::pmr::memory_resource *mr = nullptr);
245
252Value asecd(const Value &x, std::pmr::memory_resource *mr = nullptr);
253
260Value acscd(const Value &x, std::pmr::memory_resource *mr = nullptr);
261
268Value acotd(const Value &x, std::pmr::memory_resource *mr = nullptr);
269
278Value sinpi(const Value &x, std::pmr::memory_resource *mr = nullptr);
279
288Value cospi(const Value &x, std::pmr::memory_resource *mr = nullptr);
289
298Value deg2rad(const Value &x, std::pmr::memory_resource *mr = nullptr);
299
308Value rad2deg(const Value &x, std::pmr::memory_resource *mr = nullptr);
309
316Value wrapToPi(const Value &x, std::pmr::memory_resource *mr = nullptr);
317
324Value wrapTo2Pi(const Value &x, std::pmr::memory_resource *mr = nullptr);
325
332Value wrapTo180(const Value &x, std::pmr::memory_resource *mr = nullptr);
333
340Value wrapTo360(const Value &x, std::pmr::memory_resource *mr = nullptr);
341
342// ── Hyperbolic Functions ────────────────────────────────────────────────────
343
353Value sinh(const Value &x, std::pmr::memory_resource *mr = nullptr);
354
364Value cosh(const Value &x, std::pmr::memory_resource *mr = nullptr);
365
374Value tanh(const Value &x, std::pmr::memory_resource *mr = nullptr);
375
384Value asinh(const Value &x, std::pmr::memory_resource *mr = nullptr);
385
395Value acosh(const Value &x, std::pmr::memory_resource *mr = nullptr);
396
405Value atanh(const Value &x, std::pmr::memory_resource *mr = nullptr);
406
413Value sech(const Value &x, std::pmr::memory_resource *mr = nullptr);
414
421Value csch(const Value &x, std::pmr::memory_resource *mr = nullptr);
422
429Value coth(const Value &x, std::pmr::memory_resource *mr = nullptr);
430
437Value asech(const Value &x, std::pmr::memory_resource *mr = nullptr);
438
445Value acsch(const Value &x, std::pmr::memory_resource *mr = nullptr);
446
453Value acoth(const Value &x, std::pmr::memory_resource *mr = nullptr);
454
455// ── Coordinate Transforms ───────────────────────────────────────────────────
456
462
469
471struct CartPair {
474};
475
482
489
499PolarPair cart2pol(const Value &x, const Value &y, std::pmr::memory_resource *mr = nullptr);
500
509CylTriple cart2pol(const Value &x, const Value &y, const Value &z, std::pmr::memory_resource *mr = nullptr);
510
520CartPair pol2cart(const Value &theta, const Value &rho, std::pmr::memory_resource *mr = nullptr);
521
530CartTriple pol2cart(const Value &theta, const Value &rho, const Value &z, std::pmr::memory_resource *mr = nullptr);
531
542SphTriple cart2sph(const Value &x, const Value &y, const Value &z, std::pmr::memory_resource *mr = nullptr);
543
554CartTriple sph2cart(const Value &az, const Value &el, const Value &r, std::pmr::memory_resource *mr = nullptr);
555
560Value cart2pol(Span<const Value> args, std::pmr::memory_resource *mr = nullptr);
561
566Value pol2cart(Span<const Value> args, std::pmr::memory_resource *mr = nullptr);
567
572Value cart2sph(Span<const Value> args, std::pmr::memory_resource *mr = nullptr);
573
578Value sph2cart(Span<const Value> args, std::pmr::memory_resource *mr = nullptr);
579
580// ── Exponentials and Logarithms ─────────────────────────────────────────────
581
591Value exp(const Value &x, std::pmr::memory_resource *mr = nullptr);
592
601Value expm1(const Value &x, std::pmr::memory_resource *mr = nullptr);
602
611Value log(const Value &x, std::pmr::memory_resource *mr = nullptr);
612
621Value log10(const Value &x, std::pmr::memory_resource *mr = nullptr);
622
631Value log2(const Value &x, std::pmr::memory_resource *mr = nullptr);
632
641Value log1p(const Value &x, std::pmr::memory_resource *mr = nullptr);
642
649Value pow2(const Value &x, std::pmr::memory_resource *mr = nullptr);
650
660Value pow2(const Value &f, const Value &e, std::pmr::memory_resource *mr = nullptr);
661
670Value nextpow2(const Value &n, std::pmr::memory_resource *mr = nullptr);
671
681Value sqrt(const Value &x, std::pmr::memory_resource *mr = nullptr);
682
691Value realsqrt(const Value &x, std::pmr::memory_resource *mr = nullptr);
692
701Value reallog(const Value &x, std::pmr::memory_resource *mr = nullptr);
702
711Value cbrt(const Value &x, std::pmr::memory_resource *mr = nullptr);
712
722Value nthroot(const Value &x, const Value &n, std::pmr::memory_resource *mr = nullptr);
723
733Value hypot(const Value &x, const Value &y, std::pmr::memory_resource *mr = nullptr);
734
744Value pow(const Value &x, const Value &y, std::pmr::memory_resource *mr = nullptr);
745
755Value realpow(const Value &x, const Value &y, std::pmr::memory_resource *mr = nullptr);
756
757// ── Complex Numbers ─────────────────────────────────────────────────────────
758
767Value real(const Value &x, std::pmr::memory_resource *mr = nullptr);
768
777Value imag(const Value &x, std::pmr::memory_resource *mr = nullptr);
778
787Value conj(const Value &x, std::pmr::memory_resource *mr = nullptr);
788
797Value angle(const Value &x, std::pmr::memory_resource *mr = nullptr);
798
808Value abs(const Value &x, std::pmr::memory_resource *mr = nullptr);
809
816Value complex(const Value &re, std::pmr::memory_resource *mr = nullptr);
817
825Value complex(const Value &re, const Value &im, std::pmr::memory_resource *mr = nullptr);
826
836Value sign(const Value &x, std::pmr::memory_resource *mr = nullptr);
837
849Value unwrap(const Value &p, double tol = 3.14159265358979323846, int dim = -1, std::pmr::memory_resource *mr = nullptr);
850
857Value isreal(const Value &x, std::pmr::memory_resource *mr = nullptr);
858
859// ── Rounding and Remainder ──────────────────────────────────────────────────
860
870Value round(const Value &x, std::pmr::memory_resource *mr = nullptr);
871
880Value roundN(const Value &x, int n, bool significant = false, std::pmr::memory_resource *mr = nullptr);
881
890Value floor(const Value &x, std::pmr::memory_resource *mr = nullptr);
891
900Value ceil(const Value &x, std::pmr::memory_resource *mr = nullptr);
901
910Value fix(const Value &x, std::pmr::memory_resource *mr = nullptr);
911
918Value subplus(const Value &x, std::pmr::memory_resource *mr = nullptr);
919
929Value mod(const Value &x, const Value &y, std::pmr::memory_resource *mr = nullptr);
930
940Value rem(const Value &x, const Value &y, std::pmr::memory_resource *mr = nullptr);
941
942
944} // namespace nk::builtin
Core MATLAB-compatible multidimensional array and scalar value type.
Definition value.hpp:61
Value unwrap(const Value &p, double tol=3.14159265358979323846, int dim=-1, std::pmr::memory_resource *mr=nullptr)
Unwraps phase angles across array dimensions.
Value wrapTo2Pi(const Value &x, std::pmr::memory_resource *mr=nullptr)
Wraps angles in radians to interval [0, 2*pi).
Value roundN(const Value &x, int n, bool significant=false, std::pmr::memory_resource *mr=nullptr)
Rounds elements to N decimal digits or N significant digits (round(x, n, type)).
Value acos(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse cosine in radians (y = acos(x)).
Value cos(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cosine in radians (y = cos(x)).
Value coth(const Value &x, std::pmr::memory_resource *mr=nullptr)
Hyperbolic cotangent (y = coth(x) = 1 / tanh(x)).
Value round(const Value &x, std::pmr::memory_resource *mr=nullptr)
Rounds elements to the nearest integer (y = round(x)).
Value acotd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse cotangent in degrees (y = acotd(x)).
Value expm1(const Value &x, std::pmr::memory_resource *mr=nullptr)
Computes exp(x) - 1 accurately for small x.
Value atand(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse tangent in degrees (y = atand(x)).
Value sec(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise secant in radians (y = sec(x) = 1 / cos(x)).
Value secd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise secant in degrees (y = secd(x)).
Value cscd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cosecant in degrees (y = cscd(x)).
Value log10(const Value &x, std::pmr::memory_resource *mr=nullptr)
Base-10 logarithm (log10(x)).
Value realsqrt(const Value &x, std::pmr::memory_resource *mr=nullptr)
Real square root with domain error check (y = realsqrt(x)).
Value sqrt(const Value &x, std::pmr::memory_resource *mr=nullptr)
Square root (y = sqrt(x)).
Value rem(const Value &x, const Value &y, std::pmr::memory_resource *mr=nullptr)
Remainder after division where sign of result matches dividend (y = rem(x, y)).
Value sign(const Value &x, std::pmr::memory_resource *mr=nullptr)
Signum function (-1, 0, 1 or unit complex phasor).
Value pow2(const Value &x, std::pmr::memory_resource *mr=nullptr)
Base-2 power scaling (y = 2.
Value nextpow2(const Value &n, std::pmr::memory_resource *mr=nullptr)
Smallest integer exponent such that 2^p >= abs(n) (p = nextpow2(n)).
Value pow(const Value &x, const Value &y, std::pmr::memory_resource *mr=nullptr)
Elementwise power (z = x .
Value acosd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse cosine in degrees (y = acosd(x)).
Value cosh(const Value &x, std::pmr::memory_resource *mr=nullptr)
Hyperbolic cosine (y = cosh(x)).
Value acoth(const Value &x, std::pmr::memory_resource *mr=nullptr)
Inverse hyperbolic cotangent (y = acoth(x)).
Value fix(const Value &x, std::pmr::memory_resource *mr=nullptr)
Rounds towards zero / truncate (y = fix(x)).
Value cosd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cosine in degrees (y = cosd(x)).
Value angle(const Value &x, std::pmr::memory_resource *mr=nullptr)
Phase angle of complex numbers in radians (y = angle(x)).
Value mod(const Value &x, const Value &y, std::pmr::memory_resource *mr=nullptr)
Modulo operation where sign of result matches divisor (y = mod(x, y)).
Value acosh(const Value &x, std::pmr::memory_resource *mr=nullptr)
Inverse hyperbolic cosine (y = acosh(x)).
Value atan(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse tangent in radians (y = atan(x)).
Value asech(const Value &x, std::pmr::memory_resource *mr=nullptr)
Inverse hyperbolic secant (y = asech(x)).
CartPair pol2cart(const Value &theta, const Value &rho, std::pmr::memory_resource *mr=nullptr)
Transforms 2D polar coordinates to Cartesian coordinates ([x, y] = pol2cart(theta,...
Value imag(const Value &x, std::pmr::memory_resource *mr=nullptr)
Imaginary part of complex array (y = imag(x)).
Value log2(const Value &x, std::pmr::memory_resource *mr=nullptr)
Base-2 logarithm (log2(x)).
Value rad2deg(const Value &x, std::pmr::memory_resource *mr=nullptr)
Converts angles from radians to degrees (y = rad2deg(x)).
Value atanh(const Value &x, std::pmr::memory_resource *mr=nullptr)
Inverse hyperbolic tangent (y = atanh(x)).
Value asin(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse sine in radians (y = asin(x)).
Value asind(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse sine in degrees (y = asind(x)).
Value realpow(const Value &x, const Value &y, std::pmr::memory_resource *mr=nullptr)
Real power with complex error check (y = realpow(x, y)).
Value acscd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse cosecant in degrees (y = acscd(x)).
Value cot(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cotangent in radians (y = cot(x) = 1 / tan(x)).
Value hypot(const Value &x, const Value &y, std::pmr::memory_resource *mr=nullptr)
Square root of sum of squares (hypot(x, y) = sqrt(x^2 + y^2)).
Value exp(const Value &x, std::pmr::memory_resource *mr=nullptr)
Natural exponential (y = exp(x)).
Value deg2rad(const Value &x, std::pmr::memory_resource *mr=nullptr)
Converts angles from degrees to radians (y = deg2rad(x)).
Value cbrt(const Value &x, std::pmr::memory_resource *mr=nullptr)
Cube root (y = cbrt(x)).
Value nthroot(const Value &x, const Value &n, std::pmr::memory_resource *mr=nullptr)
Real nth root of real numbers (y = nthroot(x, n)).
SphTriple cart2sph(const Value &x, const Value &y, const Value &z, std::pmr::memory_resource *mr=nullptr)
Transforms 3D Cartesian coordinates to spherical coordinates ([az, el, r] = cart2sph(x,...
Value wrapToPi(const Value &x, std::pmr::memory_resource *mr=nullptr)
Wraps angles in radians to interval [-pi, pi].
Value tand(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise tangent in degrees (y = tand(x)).
Value sin(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise sine in radians (y = sin(x)).
Value ceil(const Value &x, std::pmr::memory_resource *mr=nullptr)
Rounds up towards positive infinity (y = ceil(x)).
Value subplus(const Value &x, std::pmr::memory_resource *mr=nullptr)
Positive part / rectifier (y = max(x, 0)).
Value complex(const Value &re, std::pmr::memory_resource *mr=nullptr)
Constructs complex array from real part (complex(re)).
Value csch(const Value &x, std::pmr::memory_resource *mr=nullptr)
Hyperbolic cosecant (y = csch(x) = 1 / sinh(x)).
PolarPair cart2pol(const Value &x, const Value &y, std::pmr::memory_resource *mr=nullptr)
Transforms 2D Cartesian coordinates to polar coordinates ([theta, rho] = cart2pol(x,...
Value floor(const Value &x, std::pmr::memory_resource *mr=nullptr)
Rounds down towards negative infinity (y = floor(x)).
Value conj(const Value &x, std::pmr::memory_resource *mr=nullptr)
Complex conjugate (y = conj(x)).
Value wrapTo180(const Value &x, std::pmr::memory_resource *mr=nullptr)
Wraps angles in degrees to interval [-180, 180].
Value isreal(const Value &x, std::pmr::memory_resource *mr=nullptr)
Tests if array contains real values (false if complex storage is active).
Value log1p(const Value &x, std::pmr::memory_resource *mr=nullptr)
Computes log(1 + x) accurately for small x.
Value real(const Value &x, std::pmr::memory_resource *mr=nullptr)
Real part of complex array (y = real(x)).
Value csc(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cosecant in radians (y = csc(x) = 1 / sin(x)).
Value asec(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse secant in radians (y = asec(x)).
Value atan2(const Value &y, const Value &x, std::pmr::memory_resource *mr=nullptr)
Four-quadrant inverse tangent in radians (theta = atan2(y, x)).
Value acsc(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse cosecant in radians (y = acsc(x)).
Value sinh(const Value &x, std::pmr::memory_resource *mr=nullptr)
Hyperbolic sine (y = sinh(x)).
Value abs(const Value &x, std::pmr::memory_resource *mr=nullptr)
Absolute value / complex magnitude (y = abs(x)).
Value asecd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse secant in degrees (y = asecd(x)).
Value cospi(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cosine of pi times input (y = cos(pi * x)).
Value wrapTo360(const Value &x, std::pmr::memory_resource *mr=nullptr)
Wraps angles in degrees to interval [0, 360).
CartTriple sph2cart(const Value &az, const Value &el, const Value &r, std::pmr::memory_resource *mr=nullptr)
Transforms 3D spherical coordinates to Cartesian coordinates ([x, y, z] = sph2cart(az,...
Value tan(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise tangent in radians (y = tan(x)).
Value acot(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise inverse cotangent in radians (y = acot(x)).
Value sech(const Value &x, std::pmr::memory_resource *mr=nullptr)
Hyperbolic secant (y = sech(x) = 1 / cosh(x)).
Value atan2d(const Value &y, const Value &x, std::pmr::memory_resource *mr=nullptr)
Four-quadrant inverse tangent in degrees (theta = atan2d(y, x)).
Value sind(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise sine in degrees (y = sind(x)).
Value cotd(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise cotangent in degrees (y = cotd(x)).
Value acsch(const Value &x, std::pmr::memory_resource *mr=nullptr)
Inverse hyperbolic cosecant (y = acsch(x)).
Value asinh(const Value &x, std::pmr::memory_resource *mr=nullptr)
Inverse hyperbolic sine (y = asinh(x)).
Value tanh(const Value &x, std::pmr::memory_resource *mr=nullptr)
Hyperbolic tangent (y = tanh(x)).
Value sinpi(const Value &x, std::pmr::memory_resource *mr=nullptr)
Elementwise sine of pi times input (y = sin(pi * x)).
Value reallog(const Value &x, std::pmr::memory_resource *mr=nullptr)
Real natural logarithm with domain error check (y = reallog(x)).
Value log(const Value &x, std::pmr::memory_resource *mr=nullptr)
Natural logarithm (ln(x)).
Result of 2D polar to Cartesian conversion ([x, y] = pol2cart(theta, rho)).
Definition elfun.hpp:471
Value y
Y coordinate (rho .* sin(theta)).
Definition elfun.hpp:473
Value x
X coordinate (rho .* cos(theta)).
Definition elfun.hpp:472
Result of 3D cylindrical/spherical to Cartesian conversion ([x, y, z]).
Definition elfun.hpp:477
Value y
Y coordinate.
Definition elfun.hpp:479
Value z
Z coordinate.
Definition elfun.hpp:480
Value x
X coordinate.
Definition elfun.hpp:478
Result of 3D Cartesian to cylindrical conversion ([theta, rho, z] = cart2pol(x, y,...
Definition elfun.hpp:464
Value z
Height along z-axis.
Definition elfun.hpp:467
Value theta
Azimuth angle in radians in interval [-pi, pi].
Definition elfun.hpp:465
Value rho
Radial distance in xy-plane (sqrt(x^2 + y^2)).
Definition elfun.hpp:466
Result of 2D Cartesian to polar conversion ([theta, rho] = cart2pol(x, y)).
Definition elfun.hpp:458
Value theta
Angle in radians in interval [-pi, pi].
Definition elfun.hpp:459
Value rho
Radial distance from origin (sqrt(x^2 + y^2)).
Definition elfun.hpp:460
Result of 3D Cartesian to spherical conversion ([az, el, r] = cart2sph(x, y, z)).
Definition elfun.hpp:484
Value r
Radial distance from origin (sqrt(x^2 + y^2 + z^2)).
Definition elfun.hpp:487
Value el
Elevation angle in radians in interval [-pi/2, pi/2].
Definition elfun.hpp:486
Value az
Azimuth angle in radians in interval [-pi, pi].
Definition elfun.hpp:485