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}