pipeline_script/core/
math.rs

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