Skip to content
This repository was archived by the owner on Aug 2, 2024. It is now read-only.

Commit d447c5d

Browse files
committed
Klein 2.0 commit (see commit body for details).
- Entity type has been removed due to compiler inability to properly constant-fold interior expressions. - Operators have been promoted to first-order types. - A number of operators have been specialized for various types for improved throughput/latency. - Perf analysis has been updated. - Motors can now be constructed from a screw axis, angle, and displacement. - A preliminary dual number type as been added. - The exp/log methods have been promoted to free functions and now have strongly typed return values. - The project function has been added to simplify various projections.
1 parent 9aa59b9 commit d447c5d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

68 files changed

+5637
-4748
lines changed

Doxyfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1531,7 +1531,7 @@ FORMULA_MACROFILE =
15311531
# The default value is: NO.
15321532
# This tag requires that the tag GENERATE_HTML is set to YES.
15331533

1534-
USE_MATHJAX = NO
1534+
USE_MATHJAX = YES
15351535

15361536
# When MathJax is enabled you can set the default output format to be used for
15371537
# the MathJax output. See the MathJax site (see:

c_src/klein_c.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,19 @@ kln_motor const& convert(kln::motor const& motor)
6464

6565
void kln_plane_init(kln_plane* plane, float a, float b, float c, float d)
6666
{
67-
plane->p0 = kln::plane{a, b, c, d}.p0();
67+
plane->p0 = kln::plane{a, b, c, d}.p0_;
6868
}
6969

7070
void kln_line_init(kln_line* line, float a, float b, float c, float d, float e, float f)
7171
{
7272
kln::line tmp{a, b, c, d, e, f};
73-
line->p1 = tmp.p1();
74-
line->p2 = tmp.p2();
73+
line->p1 = tmp.p1_;
74+
line->p2 = tmp.p2_;
7575
}
7676

7777
void kln_point_init(kln_point* point, float x, float y, float z)
7878
{
79-
point->p3 = kln::point{x, y, z}.p3();
79+
point->p3 = kln::point{x, y, z}.p3_;
8080
}
8181

8282
kln_point kln_reflect_point(kln_plane const* plane, kln_point const* point)
@@ -171,10 +171,10 @@ kln_motor kln_compose_motors(kln_motor const* motor1, kln_motor const* motor2)
171171

172172
kln_line motor_log(kln_motor const* motor)
173173
{
174-
return convert(kln::line{convert(*motor).log()});
174+
return convert(kln::line{log(convert(*motor))});
175175
}
176176

177177
kln_motor line_exp(kln_line const* line)
178178
{
179-
return convert(kln::motor{convert(*line).exp()});
179+
return convert(kln::motor{exp(convert(*line))});
180180
}

docs/api/dir.md

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
## group `dir` {#group__dir}
2+
3+
Directions in $\mathbf{P}(\mathbb{R}^3_{3, 0, 1})$ are represented using points at infinity (homogeneous coordinate 0). Having a homogeneous coordinate of zero ensures that directions are translation-invariant.
4+
5+
### Summary
6+
7+
Members | Descriptions
8+
--------------------------------|---------------------------------------------
9+
`public ` [`direction`](#group__dir_1gac86167cefc9b8118a8f894aaba99f9a5)`() = default` |
10+
`public ` [`direction`](#group__dir_1ga8fc796733d32a69230136b8376003fca)`(float x,float y,float z) noexcept` | Create a normalized direction.
11+
`public ` [`direction`](#group__dir_1ga7cc439bc60bbbe279bbda37f2e0d139b)`(__m128 p3) noexcept` |
12+
`public explicit ` [`direction`](#group__dir_1ga42ce139ace571176acabbce21d6c64b2)`(float * data) noexcept` | Data should point to four floats with memory layout `(0.f, x, y, z)` where the zero occupies the lowest address in memory.
13+
`public float ` [`x`](#group__dir_1ga721087c2056a33cd780c678ae0ec39dd)`() const noexcept` |
14+
`public float ` [`y`](#group__dir_1ga40bc7052a639d57afde7a860c1631638)`() const noexcept` |
15+
`public float ` [`z`](#group__dir_1ga1e16d3ed0ff945d0d1cbf1e6458d334b)`() const noexcept` |
16+
`public void ` [`normalize`](#group__dir_1ga143cd2cfeb94860ce1d47b9735064802)`() noexcept` | Normalize this direction by dividing all components by the magnitude
17+
`public direction &KLN_VEC_CALL ` [`operator+=`](#group__dir_1gabf098bdf982bbd9572d9fb09a5f76786)`(direction b) noexcept` | Direction addition.
18+
`public direction &KLN_VEC_CALL ` [`operator-=`](#group__dir_1ga4bd0650e5c363ec427a4021b678f0567)`(direction b) noexcept` | Direction subtraction.
19+
`public direction & ` [`operator*=`](#group__dir_1ga8f2c363e3b6ce34e18451b6c716be97a)`(float s) noexcept` | Direction uniform scale.
20+
`public direction & ` [`operator*=`](#group__dir_1ga6a07c40530461b7a4c94d2aff1371217)`(int s) noexcept` | Direction uniform scale.
21+
`public direction & ` [`operator/=`](#group__dir_1ga9cac6b5beba3d2e2b0ce1e9a5158c25f)`(float s) noexcept` | Direction uniform inverse scale.
22+
`public direction & ` [`operator/=`](#group__dir_1ga2717db218937fdb1b88aba24d3abd189)`(int s) noexcept` | Direction uniform inverse scale.
23+
`public direction KLN_VEC_CALL ` [`operator+`](#group__dir_1ga3aa93423517b128de3d64111201220ce)`(direction a,direction b) noexcept` | Direction addition.
24+
`public direction KLN_VEC_CALL ` [`operator-`](#group__dir_1gacdc4f7208ad657c450708efcc7fe27d0)`(direction a,direction b) noexcept` | Direction subtraction.
25+
`public direction KLN_VEC_CALL ` [`operator*`](#group__dir_1ga5d061f57e3a9f92620f6e90d5dbcb8cb)`(direction d,float s) noexcept` | Direction uniform scale.
26+
`public direction KLN_VEC_CALL ` [`operator*`](#group__dir_1ga0a2f15a137d3c9ef3e5b83e3eee71f9a)`(float s,direction d) noexcept` | Direction uniform scale.
27+
`public direction KLN_VEC_CALL ` [`operator*`](#group__dir_1ga9d4aadcb32609919e0a2614b1041fdf0)`(direction d,int s) noexcept` | Direction uniform scale.
28+
`public direction KLN_VEC_CALL ` [`operator*`](#group__dir_1ga0229ad2276f2d9a7f07baee7ee3d7582)`(int s,direction d) noexcept` | Direction uniform scale.
29+
`public direction KLN_VEC_CALL ` [`operator/`](#group__dir_1ga4473202567a1e1bf3a0929c33d723f52)`(direction d,float s) noexcept` | Direction uniform inverse scale.
30+
`public direction KLN_VEC_CALL ` [`operator/`](#group__dir_1ga2a8d9ef9111a21d1a55fe08e2c656317)`(direction d,int s) noexcept` | Direction uniform inverse scale.
31+
`public direction ` [`operator-`](#group__dir_1ga65b1fe0cfac3611b65b78924cb5a61ac)`(direction d) noexcept` | Unary minus.
32+
33+
### Members
34+
35+
#### [direction](#group__dir_1gac86167cefc9b8118a8f894aaba99f9a5)() = default {#group__dir_1gac86167cefc9b8118a8f894aaba99f9a5}
36+
37+
#### [direction](#group__dir_1ga8fc796733d32a69230136b8376003fca)(float x,float y,float z) noexcept {#group__dir_1ga8fc796733d32a69230136b8376003fca}
38+
39+
Create a normalized direction.
40+
41+
#### [direction](#group__dir_1ga7cc439bc60bbbe279bbda37f2e0d139b)(__m128 p3) noexcept {#group__dir_1ga7cc439bc60bbbe279bbda37f2e0d139b}
42+
43+
#### explicit [direction](#group__dir_1ga42ce139ace571176acabbce21d6c64b2)(float * data) noexcept {#group__dir_1ga42ce139ace571176acabbce21d6c64b2}
44+
45+
Data should point to four floats with memory layout `(0.f, x, y, z)` where the zero occupies the lowest address in memory.
46+
47+
#### float [x](#group__dir_1ga721087c2056a33cd780c678ae0ec39dd)() const noexcept {#group__dir_1ga721087c2056a33cd780c678ae0ec39dd}
48+
49+
#### float [y](#group__dir_1ga40bc7052a639d57afde7a860c1631638)() const noexcept {#group__dir_1ga40bc7052a639d57afde7a860c1631638}
50+
51+
#### float [z](#group__dir_1ga1e16d3ed0ff945d0d1cbf1e6458d334b)() const noexcept {#group__dir_1ga1e16d3ed0ff945d0d1cbf1e6458d334b}
52+
53+
#### void [normalize](#group__dir_1ga143cd2cfeb94860ce1d47b9735064802)() noexcept {#group__dir_1ga143cd2cfeb94860ce1d47b9735064802}
54+
55+
Normalize this direction by dividing all components by the magnitude
56+
57+
!!! tip
58+
Direction normalization divides the coordinates by the quantity
59+
$\sqrt{x^2 + y^2 + z^2}$. This is done using the `rsqrtps`
60+
instruction with a maximum relative error of $1.5\times 2^{-12}$.
61+
62+
#### direction &KLN_VEC_CALL [operator+=](#group__dir_1gabf098bdf982bbd9572d9fb09a5f76786)(direction b) noexcept {#group__dir_1gabf098bdf982bbd9572d9fb09a5f76786}
63+
64+
Direction addition.
65+
66+
#### direction &KLN_VEC_CALL [operator-=](#group__dir_1ga4bd0650e5c363ec427a4021b678f0567)(direction b) noexcept {#group__dir_1ga4bd0650e5c363ec427a4021b678f0567}
67+
68+
Direction subtraction.
69+
70+
#### direction & [operator*=](#group__dir_1ga8f2c363e3b6ce34e18451b6c716be97a)(float s) noexcept {#group__dir_1ga8f2c363e3b6ce34e18451b6c716be97a}
71+
72+
Direction uniform scale.
73+
74+
#### direction & [operator*=](#group__dir_1ga6a07c40530461b7a4c94d2aff1371217)(int s) noexcept {#group__dir_1ga6a07c40530461b7a4c94d2aff1371217}
75+
76+
Direction uniform scale.
77+
78+
#### direction & [operator/=](#group__dir_1ga9cac6b5beba3d2e2b0ce1e9a5158c25f)(float s) noexcept {#group__dir_1ga9cac6b5beba3d2e2b0ce1e9a5158c25f}
79+
80+
Direction uniform inverse scale.
81+
82+
#### direction & [operator/=](#group__dir_1ga2717db218937fdb1b88aba24d3abd189)(int s) noexcept {#group__dir_1ga2717db218937fdb1b88aba24d3abd189}
83+
84+
Direction uniform inverse scale.
85+
86+
#### direction KLN_VEC_CALL [operator+](#group__dir_1ga3aa93423517b128de3d64111201220ce)(direction a,direction b) noexcept {#group__dir_1ga3aa93423517b128de3d64111201220ce}
87+
88+
Direction addition.
89+
90+
#### direction KLN_VEC_CALL [operator-](#group__dir_1gacdc4f7208ad657c450708efcc7fe27d0)(direction a,direction b) noexcept {#group__dir_1gacdc4f7208ad657c450708efcc7fe27d0}
91+
92+
Direction subtraction.
93+
94+
#### direction KLN_VEC_CALL [operator*](#group__dir_1ga5d061f57e3a9f92620f6e90d5dbcb8cb)(direction d,float s) noexcept {#group__dir_1ga5d061f57e3a9f92620f6e90d5dbcb8cb}
95+
96+
Direction uniform scale.
97+
98+
#### direction KLN_VEC_CALL [operator*](#group__dir_1ga0a2f15a137d3c9ef3e5b83e3eee71f9a)(float s,direction d) noexcept {#group__dir_1ga0a2f15a137d3c9ef3e5b83e3eee71f9a}
99+
100+
Direction uniform scale.
101+
102+
#### direction KLN_VEC_CALL [operator*](#group__dir_1ga9d4aadcb32609919e0a2614b1041fdf0)(direction d,int s) noexcept {#group__dir_1ga9d4aadcb32609919e0a2614b1041fdf0}
103+
104+
Direction uniform scale.
105+
106+
#### direction KLN_VEC_CALL [operator*](#group__dir_1ga0229ad2276f2d9a7f07baee7ee3d7582)(int s,direction d) noexcept {#group__dir_1ga0229ad2276f2d9a7f07baee7ee3d7582}
107+
108+
Direction uniform scale.
109+
110+
#### direction KLN_VEC_CALL [operator/](#group__dir_1ga4473202567a1e1bf3a0929c33d723f52)(direction d,float s) noexcept {#group__dir_1ga4473202567a1e1bf3a0929c33d723f52}
111+
112+
Direction uniform inverse scale.
113+
114+
#### direction KLN_VEC_CALL [operator/](#group__dir_1ga2a8d9ef9111a21d1a55fe08e2c656317)(direction d,int s) noexcept {#group__dir_1ga2a8d9ef9111a21d1a55fe08e2c656317}
115+
116+
Direction uniform inverse scale.
117+
118+
#### direction [operator-](#group__dir_1ga65b1fe0cfac3611b65b78924cb5a61ac)(direction d) noexcept {#group__dir_1ga65b1fe0cfac3611b65b78924cb5a61ac}
119+
120+
Unary minus.
121+

docs/api/dot.md

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
## group `dot` {#group__dot}
2+
3+
The symmetric inner product takes two arguments and contracts the lower graded element to the greater graded element. If lower graded element spans an index that is not contained in the higher graded element, the result is annihilated. Otherwise, the result is the part of the higher graded element "most unlike" the lower graded element. Thus, the symmetric inner product can be thought of as a bidirectional contraction operator.
4+
5+
There is some merit in providing both a left and right contraction operator for explicitness. However, when using Klein, it's generally clear what the interpretation of the symmetric inner product is with respect to the projection on various entities.
6+
7+
!!! example Angle between planes
8+
```cpp
9+
kln::plane a{x1, y1, z1, d1};
10+
kln::plane b{x2, y2, z2, d2};
11+
12+
// Compute the cos of the angle between two planes
13+
float cos_ang = a | b;
14+
```
15+
16+
17+
!!! example Line to plane through point
18+
```cpp
19+
kln::point a{x1, y1, z1};
20+
kln::plane b{x2, y2, z2, d2};
21+
22+
// The line l contains a and the shortest path from a to plane b.
23+
line l = a | b;
24+
```
25+
26+
### Summary
27+
28+
Members | Descriptions
29+
--------------------------------|---------------------------------------------
30+
`public float ` [`operator\|`](#group__dot_1gad318da9ce7f0d17c6be4a28606f7055d)`(plane a,plane b) noexcept` |
31+
`public plane ` [`operator\|`](#group__dot_1gac5eb4e0be057f05d06fdb47af9c67884)`(plane a,line b) noexcept` |
32+
`public plane ` [`operator\|`](#group__dot_1ga6e653adaf2281eb98ea2fb859adebf91)`(line b,plane a) noexcept` |
33+
`public plane ` [`operator\|`](#group__dot_1ga95c5016a18aac7ec611fbb69ade553eb)`(plane a,ideal_line b) noexcept` |
34+
`public plane ` [`operator\|`](#group__dot_1ga3672748f41be5a0c523e0434bb48da7d)`(ideal_line b,plane a) noexcept` |
35+
`public line ` [`operator\|`](#group__dot_1gaf165d820d2709047750f9f9c4e627dc2)`(plane a,point b) noexcept` |
36+
`public line ` [`operator\|`](#group__dot_1ga21190874d649c1828316b8133c8c7ec0)`(point a,plane b) noexcept` |
37+
`public float ` [`operator\|`](#group__dot_1gab9b2443f7c67a96f08b03ce749565305)`(line a,line b) noexcept` |
38+
`public plane ` [`operator\|`](#group__dot_1ga4319b71d30d700e2579c26e181fd16fd)`(point a,line b) noexcept` |
39+
`public plane ` [`operator\|`](#group__dot_1ga36111b62f962203bb1a964cd6417b371)`(line b,point a) noexcept` |
40+
`public float ` [`operator\|`](#group__dot_1ga4ad7845d5581052aca22d5547ef7d5b1)`(point a,point b) noexcept` |
41+
42+
### Members
43+
44+
#### float [operator|](#group__dot_1gad318da9ce7f0d17c6be4a28606f7055d)(plane a,plane b) noexcept {#group__dot_1gad318da9ce7f0d17c6be4a28606f7055d}
45+
46+
#### plane [operator|](#group__dot_1gac5eb4e0be057f05d06fdb47af9c67884)(plane a,line b) noexcept {#group__dot_1gac5eb4e0be057f05d06fdb47af9c67884}
47+
48+
#### plane [operator|](#group__dot_1ga6e653adaf2281eb98ea2fb859adebf91)(line b,plane a) noexcept {#group__dot_1ga6e653adaf2281eb98ea2fb859adebf91}
49+
50+
#### plane [operator|](#group__dot_1ga95c5016a18aac7ec611fbb69ade553eb)(plane a,ideal_line b) noexcept {#group__dot_1ga95c5016a18aac7ec611fbb69ade553eb}
51+
52+
#### plane [operator|](#group__dot_1ga3672748f41be5a0c523e0434bb48da7d)(ideal_line b,plane a) noexcept {#group__dot_1ga3672748f41be5a0c523e0434bb48da7d}
53+
54+
#### line [operator|](#group__dot_1gaf165d820d2709047750f9f9c4e627dc2)(plane a,point b) noexcept {#group__dot_1gaf165d820d2709047750f9f9c4e627dc2}
55+
56+
#### line [operator|](#group__dot_1ga21190874d649c1828316b8133c8c7ec0)(point a,plane b) noexcept {#group__dot_1ga21190874d649c1828316b8133c8c7ec0}
57+
58+
#### float [operator|](#group__dot_1gab9b2443f7c67a96f08b03ce749565305)(line a,line b) noexcept {#group__dot_1gab9b2443f7c67a96f08b03ce749565305}
59+
60+
#### plane [operator|](#group__dot_1ga4319b71d30d700e2579c26e181fd16fd)(point a,line b) noexcept {#group__dot_1ga4319b71d30d700e2579c26e181fd16fd}
61+
62+
#### plane [operator|](#group__dot_1ga36111b62f962203bb1a964cd6417b371)(line b,point a) noexcept {#group__dot_1ga36111b62f962203bb1a964cd6417b371}
63+
64+
#### float [operator|](#group__dot_1ga4ad7845d5581052aca22d5547ef7d5b1)(point a,point b) noexcept {#group__dot_1ga4ad7845d5581052aca22d5547ef7d5b1}
65+

docs/api/dual.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
## group `dual` {#group__dual}
2+
3+
The Poincaré Dual of an element is the "subspace complement" of the argument with respect to the pseudoscalar in the exterior algebra. In practice, it is a relabeling of the coordinates to their dual-coordinates and is used most often to implement a "join" operation in terms of the exterior product of the duals of each operand.
4+
5+
Ex: The dual of the point $\mathbf{e}_{123} + 3\mathbf{e}_{013} - 2\mathbf{e}_{021}$ (the point at $(0, 3, -2)$) is the plane $\mathbf{e}_0 + 3\mathbf{e}_2 - 2\mathbf{e}_3$.
6+
7+
### Summary
8+
9+
Members | Descriptions
10+
--------------------------------|---------------------------------------------
11+
`public KLN_INLINE point KLN_VEC_CALL ` [`operator!`](#group__dual_1ga3a687310cf04e42ff485b03d557ed5a0)`(plane in) noexcept` |
12+
`public KLN_INLINE plane KLN_VEC_CALL ` [`operator!`](#group__dual_1ga105ff06095b7eb1fc4ab4b345d7aefb1)`(point in) noexcept` |
13+
`public KLN_INLINE line KLN_VEC_CALL ` [`operator!`](#group__dual_1gaa54dbe6355262d69f4302296708cc3fd)`(line in) noexcept` |
14+
`public KLN_INLINE branch KLN_VEC_CALL ` [`operator!`](#group__dual_1gac57689e4bf002977c93dbb5e162f7a73)`(ideal_line in) noexcept` |
15+
`public KLN_INLINE ideal_line KLN_VEC_CALL ` [`operator!`](#group__dual_1gaba4e70ba96775d4bda3676593256a6be)`(branch in) noexcept` |
16+
`public KLN_INLINE dual KLN_VEC_CALL ` [`operator!`](#group__dual_1ga322859aabdd00a64e316ef1d4923a266)`(dual in) noexcept` |
17+
18+
### Members
19+
20+
#### KLN_INLINE point KLN_VEC_CALL [operator!](#group__dual_1ga3a687310cf04e42ff485b03d557ed5a0)(plane in) noexcept {#group__dual_1ga3a687310cf04e42ff485b03d557ed5a0}
21+
22+
#### KLN_INLINE plane KLN_VEC_CALL [operator!](#group__dual_1ga105ff06095b7eb1fc4ab4b345d7aefb1)(point in) noexcept {#group__dual_1ga105ff06095b7eb1fc4ab4b345d7aefb1}
23+
24+
#### KLN_INLINE line KLN_VEC_CALL [operator!](#group__dual_1gaa54dbe6355262d69f4302296708cc3fd)(line in) noexcept {#group__dual_1gaa54dbe6355262d69f4302296708cc3fd}
25+
26+
#### KLN_INLINE branch KLN_VEC_CALL [operator!](#group__dual_1gac57689e4bf002977c93dbb5e162f7a73)(ideal_line in) noexcept {#group__dual_1gac57689e4bf002977c93dbb5e162f7a73}
27+
28+
#### KLN_INLINE ideal_line KLN_VEC_CALL [operator!](#group__dual_1gaba4e70ba96775d4bda3676593256a6be)(branch in) noexcept {#group__dual_1gaba4e70ba96775d4bda3676593256a6be}
29+
30+
#### KLN_INLINE dual KLN_VEC_CALL [operator!](#group__dual_1ga322859aabdd00a64e316ef1d4923a266)(dual in) noexcept {#group__dual_1ga322859aabdd00a64e316ef1d4923a266}
31+

docs/api/dualn.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
## group `dualn` {#group__dualn}
2+
3+
A dual number is a multivector of the form $p + q\mathbf{e}_{0123}$.
4+
5+
### Summary
6+
7+
Members | Descriptions
8+
--------------------------------|---------------------------------------------
9+
`public dual KLN_VEC_CALL ` [`operator+`](#group__dualn_1gad54e557339dd7c8929fb70177ce99431)`(dual a,dual b) noexcept` |
10+
`public dual KLN_VEC_CALL ` [`operator-`](#group__dualn_1gac3c6b82d268dbc0ce92a43479952f30a)`(dual a,dual b) noexcept` |
11+
`public dual KLN_VEC_CALL ` [`operator*`](#group__dualn_1gaaad721d43b803f0bf57bc8d1454dd824)`(dual a,float s) noexcept` |
12+
`public dual KLN_VEC_CALL ` [`operator*`](#group__dualn_1ga061a15005779a7687ab40e54a3257fca)`(float s,dual a) noexcept` |
13+
`public dual KLN_VEC_CALL ` [`operator/`](#group__dualn_1ga2c6bedacc94979d14173bd340aefd6d5)`(dual a,float s) noexcept` |
14+
15+
### Members
16+
17+
#### dual KLN_VEC_CALL [operator+](#group__dualn_1gad54e557339dd7c8929fb70177ce99431)(dual a,dual b) noexcept {#group__dualn_1gad54e557339dd7c8929fb70177ce99431}
18+
19+
#### dual KLN_VEC_CALL [operator-](#group__dualn_1gac3c6b82d268dbc0ce92a43479952f30a)(dual a,dual b) noexcept {#group__dualn_1gac3c6b82d268dbc0ce92a43479952f30a}
20+
21+
#### dual KLN_VEC_CALL [operator*](#group__dualn_1gaaad721d43b803f0bf57bc8d1454dd824)(dual a,float s) noexcept {#group__dualn_1gaaad721d43b803f0bf57bc8d1454dd824}
22+
23+
#### dual KLN_VEC_CALL [operator*](#group__dualn_1ga061a15005779a7687ab40e54a3257fca)(float s,dual a) noexcept {#group__dualn_1ga061a15005779a7687ab40e54a3257fca}
24+
25+
#### dual KLN_VEC_CALL [operator/](#group__dualn_1ga2c6bedacc94979d14173bd340aefd6d5)(dual a,float s) noexcept {#group__dualn_1ga2c6bedacc94979d14173bd340aefd6d5}
26+

0 commit comments

Comments
 (0)