pipeline_script/core/math.rs
1
2
3/// 计算正弦值
4///
5/// # 参数
6/// * `x` - 输入角度(弧度)
7///
8/// # 返回值
9/// 返回x的正弦值
10pub extern "C" fn sin(x: f64) -> f64 {
11 x.sin()
12}
13
14/// 计算余弦值
15///
16/// # 参数
17/// * `x` - 输入角度(弧度)
18///
19/// # 返回值
20/// 返回x的余弦值
21pub extern "C" fn cos(x: f64) -> f64 {
22 x.cos()
23}
24
25/// 计算正切值
26///
27/// # 参数
28/// * `x` - 输入角度(弧度)
29///
30/// # 返回值
31/// 返回x的正切值
32pub extern "C" fn tan(x: f64) -> f64 {
33 x.tan()
34}
35
36/// 计算反正弦值
37///
38/// # 参数
39/// * `x` - 输入值(范围:-1到1)
40///
41/// # 返回值
42/// 返回x的反正弦值(弧度)
43pub extern "C" fn asin(x: f64) -> f64 {
44 x.asin()
45}
46
47/// 计算反余弦值
48///
49/// # 参数
50/// * `x` - 输入值(范围:-1到1)
51///
52/// # 返回值
53/// 返回x的反余弦值(弧度)
54pub extern "C" fn acos(x: f64) -> f64 {
55 x.acos()
56}
57
58/// 计算反正切值
59///
60/// # 参数
61/// * `x` - 输入值
62///
63/// # 返回值
64/// 返回x的反正切值(弧度)
65pub extern "C" fn atan(x: f64) -> f64 {
66 x.atan()
67}
68
69/// 计算两点间的反正切值
70///
71/// # 参数
72/// * `y` - y坐标
73/// * `x` - x坐标
74///
75/// # 返回值
76/// 返回从x轴到点(x,y)的角度(弧度)
77pub extern "C" fn atan2(y: f64, x: f64) -> f64 {
78 y.atan2(x)
79}
80
81/// 计算自然指数函数
82///
83/// # 参数
84/// * `x` - 指数
85///
86/// # 返回值
87/// 返回e的x次方
88pub extern "C" fn exp(x: f64) -> f64 {
89 x.exp()
90}
91
92/// 计算2的x次方
93///
94/// # 参数
95/// * `x` - 指数
96///
97/// # 返回值
98/// 返回2的x次方
99pub extern "C" fn exp2(x: f64) -> f64 {
100 x.exp2()
101}
102
103/// 计算自然对数
104///
105/// # 参数
106/// * `x` - 输入值(必须大于0)
107///
108/// # 返回值
109/// 返回x的自然对数
110pub extern "C" fn ln(x: f64) -> f64 {
111 x.ln()
112}
113
114/// 计算以10为底的对数
115///
116/// # 参数
117/// * `x` - 输入值(必须大于0)
118///
119/// # 返回值
120/// 返回x的常用对数
121pub extern "C" fn log10(x: f64) -> f64 {
122 x.log10()
123}
124
125/// 计算以2为底的对数
126///
127/// # 参数
128/// * `x` - 输入值(必须大于0)
129///
130/// # 返回值
131/// 返回x的二进制对数
132pub extern "C" fn log2(x: f64) -> f64 {
133 x.log2()
134}
135
136/// 计算幂函数
137///
138/// # 参数
139/// * `base` - 底数
140/// * `exponent` - 指数
141///
142/// # 返回值
143/// 返回base的exponent次方
144pub extern "C" fn pow(base: f64, exponent: f64) -> f64 {
145 base.powf(exponent)
146}
147
148/// 计算平方根
149///
150/// # 参数
151/// * `x` - 输入值(必须大于等于0)
152///
153/// # 返回值
154/// 返回x的平方根
155pub extern "C" fn sqrt(x: f64) -> f64 {
156 x.sqrt()
157}
158
159/// 计算立方根
160///
161/// # 参数
162/// * `x` - 输入值
163///
164/// # 返回值
165/// 返回x的立方根
166pub extern "C" fn cbrt(x: f64) -> f64 {
167 x.cbrt()
168}
169
170/// 向下取整
171///
172/// # 参数
173/// * `x` - 输入值
174///
175/// # 返回值
176/// 返回不大于x的最大整数
177pub extern "C" fn floor(x: f64) -> f64 {
178 x.floor()
179}
180
181/// 向上取整
182///
183/// # 参数
184/// * `x` - 输入值
185///
186/// # 返回值
187/// 返回不小于x的最小整数
188pub extern "C" fn ceil(x: f64) -> f64 {
189 x.ceil()
190}
191
192/// 四舍五入
193///
194/// # 参数
195/// * `x` - 输入值
196///
197/// # 返回值
198/// 返回最接近x的整数
199pub extern "C" fn round(x: f64) -> f64 {
200 x.round()
201}
202
203/// 截断小数部分
204///
205/// # 参数
206/// * `x` - 输入值
207///
208/// # 返回值
209/// 返回x的整数部分
210pub extern "C" fn trunc(x: f64) -> f64 {
211 x.trunc()
212}
213
214/// 计算绝对值(浮点数版本)
215///
216/// # 参数
217/// * `x` - 输入值
218///
219/// # 返回值
220/// 返回x的绝对值
221pub extern "C" fn abs_f64(x: f64) -> f64 {
222 x.abs()
223}
224
225/// 计算绝对值(32位浮点数版本)
226///
227/// # 参数
228/// * `x` - 输入值
229///
230/// # 返回值
231/// 返回x的绝对值
232pub extern "C" fn abs_f32(x: f32) -> f32 {
233 x.abs()
234}
235
236/// 计算绝对值(64位整数版本)
237///
238/// # 参数
239/// * `x` - 输入值
240///
241/// # 返回值
242/// 返回x的绝对值
243pub extern "C" fn abs_i64(x: i64) -> i64 {
244 x.abs()
245}
246
247/// 计算绝对值(32位整数版本)
248///
249/// # 参数
250/// * `x` - 输入值
251///
252/// # 返回值
253/// 返回x的绝对值
254pub extern "C" fn abs_i32(x: i32) -> i32 {
255 x.abs()
256}
257
258/// 计算两个数的最大值(浮点数版本)
259///
260/// # 参数
261/// * `a` - 第一个数
262/// * `b` - 第二个数
263///
264/// # 返回值
265/// 返回a和b中的较大值
266pub extern "C" fn max_f64(a: f64, b: f64) -> f64 {
267 a.max(b)
268}
269
270/// 计算两个数的最小值(浮点数版本)
271///
272/// # 参数
273/// * `a` - 第一个数
274/// * `b` - 第二个数
275///
276/// # 返回值
277/// 返回a和b中的较小值
278pub extern "C" fn min_f64(a: f64, b: f64) -> f64 {
279 a.min(b)
280}
281
282/// 计算两个数的最大值(64位整数版本)
283///
284/// # 参数
285/// * `a` - 第一个数
286/// * `b` - 第二个数
287///
288/// # 返回值
289/// 返回a和b中的较大值
290pub extern "C" fn max_i64(a: i64, b: i64) -> i64 {
291 a.max(b)
292}
293
294/// 计算两个数的最小值(64位整数版本)
295///
296/// # 参数
297/// * `a` - 第一个数
298/// * `b` - 第二个数
299///
300/// # 返回值
301/// 返回a和b中的较小值
302pub extern "C" fn min_i64(a: i64, b: i64) -> i64 {
303 a.min(b)
304}
305
306/// 将值限制在指定范围内
307///
308/// # 参数
309/// * `value` - 要限制的值
310/// * `min` - 最小值
311/// * `max` - 最大值
312///
313/// # 返回值
314/// 返回限制在[min, max]范围内的值
315pub extern "C" fn clamp_f64(value: f64, min: f64, max: f64) -> f64 {
316 value.clamp(min, max)
317}
318
319/// 将值限制在指定范围内(整数版本)
320///
321/// # 参数
322/// * `value` - 要限制的值
323/// * `min` - 最小值
324/// * `max` - 最大值
325///
326/// # 返回值
327/// 返回限制在[min, max]范围内的值
328pub extern "C" fn clamp_i64(value: i64, min: i64, max: i64) -> i64 {
329 value.clamp(min, max)
330}
331
332/// 计算两个数的余数
333///
334/// # 参数
335/// * `dividend` - 被除数
336/// * `divisor` - 除数
337///
338/// # 返回值
339/// 返回dividend除以divisor的余数
340pub extern "C" fn fmod(dividend: f64, divisor: f64) -> f64 {
341 dividend % divisor
342}
343
344/// 计算双曲正弦值
345///
346/// # 参数
347/// * `x` - 输入值
348///
349/// # 返回值
350/// 返回x的双曲正弦值
351pub extern "C" fn sinh(x: f64) -> f64 {
352 x.sinh()
353}
354
355/// 计算双曲余弦值
356///
357/// # 参数
358/// * `x` - 输入值
359///
360/// # 返回值
361/// 返回x的双曲余弦值
362pub extern "C" fn cosh(x: f64) -> f64 {
363 x.cosh()
364}
365
366/// 计算双曲正切值
367///
368/// # 参数
369/// * `x` - 输入值
370///
371/// # 返回值
372/// 返回x的双曲正切值
373pub extern "C" fn tanh(x: f64) -> f64 {
374 x.tanh()
375}
376
377/// 将角度转换为弧度
378///
379/// # 参数
380/// * `degrees` - 角度值
381///
382/// # 返回值
383/// 返回对应的弧度值
384pub extern "C" fn to_radians(degrees: f64) -> f64 {
385 degrees.to_radians()
386}
387
388/// 将弧度转换为角度
389///
390/// # 参数
391/// * `radians` - 弧度值
392///
393/// # 返回值
394/// 返回对应的角度值
395pub extern "C" fn to_degrees(radians: f64) -> f64 {
396 radians.to_degrees()
397}
398
399/// 判断浮点数是否为NaN
400///
401/// # 参数
402/// * `x` - 输入值
403///
404/// # 返回值
405/// 如果x是NaN返回true,否则返回false
406pub extern "C" fn is_nan(x: f64) -> bool {
407 x.is_nan()
408}
409
410/// 判断浮点数是否为无穷大
411///
412/// # 参数
413/// * `x` - 输入值
414///
415/// # 返回值
416/// 如果x是无穷大返回true,否则返回false
417pub extern "C" fn is_infinite(x: f64) -> bool {
418 x.is_infinite()
419}
420
421/// 判断浮点数是否为有限数
422///
423/// # 参数
424/// * `x` - 输入值
425///
426/// # 返回值
427/// 如果x是有限数返回true,否则返回false
428pub extern "C" fn is_finite(x: f64) -> bool {
429 x.is_finite()
430}
431
432/// 生成随机数(0到1之间)
433///
434/// # 返回值
435/// 返回0到1之间的随机浮点数
436pub extern "C" fn random() -> f64 {
437 use std::collections::hash_map::DefaultHasher;
438 use std::hash::{Hash, Hasher};
439 use std::time::{SystemTime, UNIX_EPOCH};
440
441 // 使用当前时间作为种子生成伪随机数
442 let mut hasher = DefaultHasher::new();
443 SystemTime::now()
444 .duration_since(UNIX_EPOCH)
445 .unwrap()
446 .as_nanos()
447 .hash(&mut hasher);
448
449 let hash = hasher.finish();
450 // 将hash值转换为0-1之间的浮点数
451 (hash as f64) / (u64::MAX as f64)
452}
453
454/// 生成指定范围内的随机整数
455///
456/// # 参数
457/// * `min` - 最小值(包含)
458/// * `max` - 最大值(不包含)
459///
460/// # 返回值
461/// 返回[min, max)范围内的随机整数
462pub extern "C" fn random_range_i64(min: i64, max: i64) -> i64 {
463 if min >= max {
464 return min;
465 }
466 let range = (max - min) as u64;
467 let random_val = random();
468 min + ((random_val * range as f64) as i64)
469}
470
471/// 生成指定范围内的随机浮点数
472///
473/// # 参数
474/// * `min` - 最小值(包含)
475/// * `max` - 最大值(不包含)
476///
477/// # 返回值
478/// 返回[min, max)范围内的随机浮点数
479pub extern "C" fn random_range_f64(min: f64, max: f64) -> f64 {
480 if min >= max {
481 return min;
482 }
483 let range = max - min;
484 min + (random() * range)
485}
486
487/// 计算阶乘
488///
489/// # 参数
490/// * `n` - 输入的非负整数
491///
492/// # 返回值
493/// 返回n的阶乘,如果n < 0则返回1
494pub extern "C" fn factorial(n: i64) -> i64 {
495 if n < 0 {
496 return 1;
497 }
498 if n <= 1 {
499 return 1;
500 }
501
502 let mut result = 1i64;
503 for i in 2..=n {
504 result = result.saturating_mul(i); // 防止溢出
505 }
506 result
507}
508
509/// 计算最大公约数
510///
511/// # 参数
512/// * `a` - 第一个数
513/// * `b` - 第二个数
514///
515/// # 返回值
516/// 返回a和b的最大公约数
517pub extern "C" fn gcd(a: i64, b: i64) -> i64 {
518 let mut a = a.abs();
519 let mut b = b.abs();
520
521 while b != 0 {
522 let temp = b;
523 b = a % b;
524 a = temp;
525 }
526 a
527}
528
529/// 计算最小公倍数
530///
531/// # 参数
532/// * `a` - 第一个数
533/// * `b` - 第二个数
534///
535/// # 返回值
536/// 返回a和b的最小公倍数
537pub extern "C" fn lcm(a: i64, b: i64) -> i64 {
538 if a == 0 || b == 0 {
539 return 0;
540 }
541 (a.abs() / gcd(a, b)) * b.abs()
542}
543
544/// 数学常量:圆周率π
545pub extern "C" fn get_pi() -> f64 {
546 std::f64::consts::PI
547}
548
549/// 数学常量:自然常数e
550pub extern "C" fn get_e() -> f64 {
551 std::f64::consts::E
552}
553
554/// 数学常量:黄金比例φ
555pub extern "C" fn get_phi() -> f64 {
556 (1.0 + 5.0_f64.sqrt()) / 2.0
557}
558
559/// 数学常量:ln(2)
560pub extern "C" fn get_ln2() -> f64 {
561 std::f64::consts::LN_2
562}
563
564/// 数学常量:ln(10)
565pub extern "C" fn get_ln10() -> f64 {
566 std::f64::consts::LN_10
567}
568
569/// 数学常量:log₁₀(e)
570pub extern "C" fn get_log10_e() -> f64 {
571 std::f64::consts::LOG10_E
572}
573
574/// 数学常量:log₂(e)
575pub extern "C" fn get_log2_e() -> f64 {
576 std::f64::consts::LOG2_E
577}
578
579/// 数学常量:√2
580pub extern "C" fn get_sqrt2() -> f64 {
581 std::f64::consts::SQRT_2
582}
583
584/// 数学常量:1/√2
585pub extern "C" fn get_frac_1_sqrt2() -> f64 {
586 std::f64::consts::FRAC_1_SQRT_2
587}