Skip to content

Commit b8b0f39

Browse files
better asin, acos, atan, atan2 implementation
1 parent 22623ab commit b8b0f39

File tree

6 files changed

+638
-302
lines changed

6 files changed

+638
-302
lines changed

double/double.mbti

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,10 @@ let not_a_number : Double
1818
// Types and methods
1919
impl Double {
2020
abs(Double) -> Double
21+
acos(Double) -> Double
22+
asin(Double) -> Double
23+
atan(Double) -> Double
24+
atan2(Double, Double) -> Double
2125
ceil(Double) -> Double
2226
cos(Double) -> Double
2327
exp(Double) -> Double

double/trig_js.mbt

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,115 @@ pub fn cos(self : Double) -> Double = "Math" "cos"
8989
/// }
9090
/// ```
9191
pub fn tan(self : Double) -> Double = "Math" "tan"
92+
93+
///|
94+
/// Calculates the arcsine of a number. Handles special cases and edge conditions
95+
/// according to IEEE 754 standards.
96+
///
97+
/// Parameters:
98+
///
99+
/// * `x` : The number for which to calculate the arcsine.
100+
///
101+
/// Returns the arcsine of the number `x`.
102+
///
103+
/// * Returns NaN if the input is NaN.
104+
/// * Returns NaN if the input is less than -1 or greater than 1.
105+
///
106+
/// Example:
107+
///
108+
/// ```moonbit
109+
/// test "asin" {
110+
/// inspect!(0.0.asin(), content="0")
111+
/// inspect!(1.0.asin(), content="1.5707963267948966")
112+
/// inspect!((-1.0).asin(), content="-1.5707963267948966")
113+
/// inspect!(@double.not_a_number.asin(), content="NaN")
114+
/// inspect!(@double.infinity.asin(), content="NaN")
115+
/// inspect!(@double.neg_infinity.asin(), content="NaN")
116+
/// }
117+
/// ```
118+
pub fn asin(self : Double) -> Double = "Math" "asin"
119+
120+
///|
121+
/// Calculates the arccosine of a number.
122+
///
123+
/// Parameters:
124+
///
125+
/// * `x` : The number for which to calculate the arccosine.
126+
///
127+
/// Returns the arccosine of the number `x`.
128+
///
129+
/// * Returns NaN if the input is NaN.
130+
/// * Returns NaN if the input is less than -1 or greater than 1.
131+
///
132+
/// Example:
133+
///
134+
/// ```moonbit
135+
/// test "acos" {
136+
/// inspect!(0.0.acos(), content="1.5707963267948966")
137+
/// inspect!(1.0.acos(), content="0")
138+
/// inspect!((-1.0).acos(), content="3.141592653589793")
139+
/// inspect!(@double.not_a_number.acos(), content="NaN")
140+
/// inspect!(@double.infinity.acos(), content="NaN")
141+
/// inspect!(@double.neg_infinity.acos(), content="NaN")
142+
/// inspect!(0.0.acos(), content="1.5707963267948966")
143+
/// }
144+
/// ```
145+
pub fn acos(self : Double) -> Double = "Math" "acos"
146+
147+
///|
148+
/// Calculates the arctangent of a number.
149+
///
150+
/// Parameters:
151+
///
152+
/// * `x` : The number for which to calculate the arctangent.
153+
///
154+
/// Returns the arctangent of the number `x`.
155+
///
156+
/// Example:
157+
///
158+
/// * Returns NaN if the input is NaN.
159+
///
160+
/// ```moonbit
161+
/// test "atan" {
162+
/// inspect!(0.0.atan(), content="0")
163+
/// inspect!(1.0.atan(), content="0.7853981633974483")
164+
/// inspect!((-1.0).atan(), content="-0.7853981633974483")
165+
/// inspect!(@double.not_a_number.atan(), content="NaN")
166+
/// inspect!(@double.infinity.atan(), content="1.5707963267948966")
167+
/// inspect!(@double.neg_infinity.atan(), content="-1.5707963267948966")
168+
/// }
169+
/// ```
170+
pub fn atan(self : Double) -> Double = "Math" "atan"
171+
172+
///|
173+
/// Calculates the arctangent of the quotient of two numbers.
174+
///
175+
/// Parameters:
176+
///
177+
/// * `self` : The numerator of the quotient.
178+
/// * `x` : The denominator of the quotient.
179+
///
180+
/// Returns the arctangent of the quotient `self / x`.
181+
///
182+
/// * Returns NaN if self or x is NaN.
183+
///
184+
/// Example:
185+
///
186+
/// ```moonbit
187+
/// test "atan2" {
188+
/// inspect!(0.0.atan2(-1.0), content="3.141592653589793")
189+
/// inspect!(1.0.atan2(0.0), content="1.5707963267948966")
190+
/// inspect!(1.0.atan2(1.0), content="0.7853981633974483")
191+
/// inspect!(not_a_number.atan2(1.0), content="NaN")
192+
/// inspect!(1.0.atan2(not_a_number), content="NaN")
193+
/// inspect!(infinity.atan2(1.0), content="1.5707963267948966")
194+
/// inspect!(1.0.atan2(infinity), content="0")
195+
/// inspect!(neg_infinity.atan2(1.0), content="-1.5707963267948966")
196+
/// inspect!(1.0.atan2(neg_infinity), content="3.141592653589793")
197+
/// inspect!(infinity.atan2(infinity), content="0.7853981633974483")
198+
/// inspect!(neg_infinity.atan2(neg_infinity), content="-2.356194490192345")
199+
/// inspect!(infinity.atan2(neg_infinity), content="2.356194490192345")
200+
/// inspect!(neg_infinity.atan2(infinity), content="-0.7853981633974483")
201+
/// }
202+
/// ```
203+
pub fn atan2(self : Double, x : Double) -> Double = "Math" "atan2"

0 commit comments

Comments
 (0)