aether/builtins/math.rs
1// src/builtins/math.rs
2//! Mathematical built-in functions
3//!
4//! This module provides:
5//! - Basic math: abs, floor, ceil, round, sqrt, pow
6//! - Trigonometry: sin, cos, tan, asin, acos, atan, atan2
7//! - Logarithms: log, ln, log2
8//! - Exponentials: exp, exp2
9//! - Advanced: factorial, gamma, erf, hypot
10//! - Statistics: mean, median, std, variance, quantile
11//! - Vector operations: dot, norm, cross, distance
12//! - Matrix operations: determinant, transpose, matmul
13//! - Constants: PI, E, TAU, PHI
14
15use crate::evaluator::RuntimeError;
16use crate::value::Value;
17use std::f64::consts;
18
19// ============================================================================
20// 基础数学函数
21// ============================================================================
22
23/// 绝对值
24///
25/// # 功能
26/// 返回数字的绝对值(非负值)。
27///
28/// # 参数
29/// - `x`: Number - 输入数字
30///
31/// # 返回值
32/// Number - 输入数字的绝对值
33///
34/// # 公式
35/// ```
36/// |x| = { x if x ≥ 0
37/// {-x if x < 0
38/// ```
39///
40/// # 示例
41/// ```aether
42/// Set a Abs(-5) # 5
43/// Set b Abs(3.14) # 3.14
44/// Set c Abs(-42.7) # 42.7
45/// ```
46pub fn abs(args: &[Value]) -> Result<Value, RuntimeError> {
47 if args.len() != 1 {
48 return Err(RuntimeError::WrongArity {
49 expected: 1,
50 got: args.len(),
51 });
52 }
53
54 match &args[0] {
55 Value::Number(n) => Ok(Value::Number(n.abs())),
56 _ => Err(RuntimeError::TypeErrorDetailed {
57 expected: "Number".to_string(),
58 got: format!("{:?}", args[0]),
59 }),
60 }
61}
62
63/// 向下取整
64///
65/// # 功能
66/// 返回不大于输入数字的最大整数(向负无穷方向取整)。
67///
68/// # 参数
69/// - `x`: Number - 输入数字
70///
71/// # 返回值
72/// Number - 向下取整后的整数值
73///
74/// # 示例
75/// ```aether
76/// Set a Floor(3.7) # 3.0
77/// Set b Floor(-2.3) # -3.0
78/// Set c Floor(5.0) # 5.0
79/// ```
80pub fn floor(args: &[Value]) -> Result<Value, RuntimeError> {
81 if args.len() != 1 {
82 return Err(RuntimeError::WrongArity {
83 expected: 1,
84 got: args.len(),
85 });
86 }
87
88 match &args[0] {
89 Value::Number(n) => Ok(Value::Number(n.floor())),
90 _ => Err(RuntimeError::TypeErrorDetailed {
91 expected: "Number".to_string(),
92 got: format!("{:?}", args[0]),
93 }),
94 }
95}
96
97/// 向上取整
98///
99/// # 功能
100/// 返回不小于输入数字的最小整数(向正无穷方向取整)。
101///
102/// # 参数
103/// - `x`: Number - 输入数字
104///
105/// # 返回值
106/// Number - 向上取整后的整数值
107///
108/// # 示例
109/// ```aether
110/// Set a Ceil(3.2) # 4.0
111/// Set b Ceil(-2.7) # -2.0
112/// Set c Ceil(5.0) # 5.0
113/// ```
114pub fn ceil(args: &[Value]) -> Result<Value, RuntimeError> {
115 if args.len() != 1 {
116 return Err(RuntimeError::WrongArity {
117 expected: 1,
118 got: args.len(),
119 });
120 }
121
122 match &args[0] {
123 Value::Number(n) => Ok(Value::Number(n.ceil())),
124 _ => Err(RuntimeError::TypeErrorDetailed {
125 expected: "Number".to_string(),
126 got: format!("{:?}", args[0]),
127 }),
128 }
129}
130
131/// 四舍五入
132///
133/// # 功能
134/// 将数字四舍五入到最接近的整数。
135///
136/// # 参数
137/// - `x`: Number - 输入数字
138///
139/// # 返回值
140/// Number - 四舍五入后的整数值
141///
142/// # 规则
143/// - 0.5 向上取整(远离零)
144///
145/// # 示例
146/// ```aether
147/// Set a Round(3.4) # 3.0
148/// Set b Round(3.5) # 4.0
149/// Set c Round(-2.5) # -3.0
150/// ```
151pub fn round(args: &[Value]) -> Result<Value, RuntimeError> {
152 if args.len() != 1 {
153 return Err(RuntimeError::WrongArity {
154 expected: 1,
155 got: args.len(),
156 });
157 }
158
159 match &args[0] {
160 Value::Number(n) => Ok(Value::Number(n.round())),
161 _ => Err(RuntimeError::TypeErrorDetailed {
162 expected: "Number".to_string(),
163 got: format!("{:?}", args[0]),
164 }),
165 }
166}
167
168/// 平方根
169///
170/// # 功能
171/// 计算数字的平方根。
172///
173/// # 参数
174/// - `x`: Number - 输入数字(必须非负)
175///
176/// # 返回值
177/// Number - 平方根值
178///
179/// # 公式
180/// ```
181/// √x = y, where y² = x
182/// ```
183///
184/// # 错误
185/// - 负数会抛出错误
186///
187/// # 示例
188/// ```aether
189/// Set a Sqrt(16) # 4.0
190/// Set b Sqrt(2) # 1.4142135623730951
191/// Set c Sqrt(0) # 0.0
192/// ```
193pub fn sqrt(args: &[Value]) -> Result<Value, RuntimeError> {
194 if args.len() != 1 {
195 return Err(RuntimeError::WrongArity {
196 expected: 1,
197 got: args.len(),
198 });
199 }
200
201 match &args[0] {
202 Value::Number(n) => {
203 if *n < 0.0 {
204 return Err(RuntimeError::InvalidOperation(format!(
205 "Cannot take square root of negative number: {}",
206 n
207 )));
208 }
209 Ok(Value::Number(n.sqrt()))
210 }
211 _ => Err(RuntimeError::TypeErrorDetailed {
212 expected: "Number".to_string(),
213 got: format!("{:?}", args[0]),
214 }),
215 }
216}
217
218/// 幂运算
219///
220/// # 功能
221/// 计算底数的指数次幂。
222///
223/// # 参数
224/// - `base`: Number - 底数
225/// - `exponent`: Number - 指数
226///
227/// # 返回值
228/// Number - base^exponent 的结果
229///
230/// # 公式
231/// ```
232/// pow(base, exp) = base^exp
233/// ```
234///
235/// # 示例
236/// ```aether
237/// Set a Pow(2, 3) # 8.0 (2³)
238/// Set b Pow(10, 2) # 100.0
239/// Set c Pow(4, 0.5) # 2.0 (√4)
240/// Set d Pow(2, -1) # 0.5 (1/2)
241/// ```
242pub fn pow(args: &[Value]) -> Result<Value, RuntimeError> {
243 if args.len() != 2 {
244 return Err(RuntimeError::WrongArity {
245 expected: 2,
246 got: args.len(),
247 });
248 }
249
250 match (&args[0], &args[1]) {
251 (Value::Number(base), Value::Number(exp)) => Ok(Value::Number(base.powf(*exp))),
252 _ => Err(RuntimeError::TypeErrorDetailed {
253 expected: "Number, Number".to_string(),
254 got: format!("{:?}, {:?}", args[0], args[1]),
255 }),
256 }
257}
258
259// ============================================================================
260// 三角函数
261// ============================================================================
262
263/// 正弦函数
264///
265/// # 功能
266/// 计算角度的正弦值(输入为弧度)。
267///
268/// # 参数
269/// - `x`: Number - 角度(弧度)
270///
271/// # 返回值
272/// Number - 正弦值,范围 [-1, 1]
273///
274/// # 公式
275/// ```
276/// sin(x): 直角三角形中,对边与斜边的比值
277/// ```
278///
279/// # 示例
280/// ```aether
281/// Set pi PI()
282/// Set a Sin(0) # 0.0
283/// Set b Sin(pi / 2) # 1.0
284/// Set c Sin(pi) # 0.0 (约等于)
285/// ```
286pub fn sin(args: &[Value]) -> Result<Value, RuntimeError> {
287 if args.len() != 1 {
288 return Err(RuntimeError::WrongArity {
289 expected: 1,
290 got: args.len(),
291 });
292 }
293
294 match &args[0] {
295 Value::Number(n) => Ok(Value::Number(n.sin())),
296 _ => Err(RuntimeError::TypeErrorDetailed {
297 expected: "Number".to_string(),
298 got: format!("{:?}", args[0]),
299 }),
300 }
301}
302
303/// 余弦函数
304///
305/// # 功能
306/// 计算角度的余弦值(输入为弧度)。
307///
308/// # 参数
309/// - `x`: Number - 角度(弧度)
310///
311/// # 返回值
312/// Number - 余弦值,范围 [-1, 1]
313///
314/// # 公式
315/// ```
316/// cos(x): 直角三角形中,邻边与斜边的比值
317/// ```
318///
319/// # 示例
320/// ```aether
321/// Set pi PI()
322/// Set a Cos(0) # 1.0
323/// Set b Cos(pi / 2) # 0.0 (约等于)
324/// Set c Cos(pi) # -1.0
325/// ```
326pub fn cos(args: &[Value]) -> Result<Value, RuntimeError> {
327 if args.len() != 1 {
328 return Err(RuntimeError::WrongArity {
329 expected: 1,
330 got: args.len(),
331 });
332 }
333
334 match &args[0] {
335 Value::Number(n) => Ok(Value::Number(n.cos())),
336 _ => Err(RuntimeError::TypeErrorDetailed {
337 expected: "Number".to_string(),
338 got: format!("{:?}", args[0]),
339 }),
340 }
341}
342
343/// 正切函数
344///
345/// # 功能
346/// 计算角度的正切值(输入为弧度)。
347///
348/// # 参数
349/// - `x`: Number - 角度(弧度)
350///
351/// # 返回值
352/// Number - 正切值
353///
354/// # 公式
355/// ```
356/// tan(x) = sin(x) / cos(x)
357/// ```
358///
359/// # 示例
360/// ```aether
361/// Set pi PI()
362/// Set a Tan(0) # 0.0
363/// Set b Tan(pi / 4) # 1.0 (约等于)
364/// Set c Tan(pi / 6) # 0.577... (√3/3)
365/// ```
366pub fn tan(args: &[Value]) -> Result<Value, RuntimeError> {
367 if args.len() != 1 {
368 return Err(RuntimeError::WrongArity {
369 expected: 1,
370 got: args.len(),
371 });
372 }
373
374 match &args[0] {
375 Value::Number(n) => Ok(Value::Number(n.tan())),
376 _ => Err(RuntimeError::TypeErrorDetailed {
377 expected: "Number".to_string(),
378 got: format!("{:?}", args[0]),
379 }),
380 }
381}
382
383// ============================================================================
384// 对数和指数函数
385// ============================================================================
386
387/// 常用对数(以10为底)
388///
389/// # 功能
390/// 计算以 10 为底的对数。
391///
392/// # 参数
393/// - `x`: Number - 输入数字(必须 > 0)
394///
395/// # 返回值
396/// Number - log₁₀(x)
397///
398/// # 公式
399/// ```
400/// log₁₀(x) = y ⟺ 10^y = x
401/// ```
402///
403/// # 错误
404/// - 非正数会抛出错误
405///
406/// # 示例
407/// ```aether
408/// Set a Log(10) # 1.0
409/// Set b Log(100) # 2.0
410/// Set c Log(1000) # 3.0
411/// ```
412pub fn log(args: &[Value]) -> Result<Value, RuntimeError> {
413 if args.len() != 1 {
414 return Err(RuntimeError::WrongArity {
415 expected: 1,
416 got: args.len(),
417 });
418 }
419
420 match &args[0] {
421 Value::Number(n) => {
422 if *n <= 0.0 {
423 return Err(RuntimeError::InvalidOperation(format!(
424 "Cannot take logarithm of non-positive number: {}",
425 n
426 )));
427 }
428 Ok(Value::Number(n.log10()))
429 }
430 _ => Err(RuntimeError::TypeErrorDetailed {
431 expected: "Number".to_string(),
432 got: format!("{:?}", args[0]),
433 }),
434 }
435}
436
437/// 自然对数(以e为底)
438///
439/// # 功能
440/// 计算以自然常数 e 为底的对数。
441///
442/// # 参数
443/// - `x`: Number - 输入数字(必须 > 0)
444///
445/// # 返回值
446/// Number - ln(x) = logₑ(x)
447///
448/// # 公式
449/// ```
450/// ln(x) = y ⟺ e^y = x
451/// ```
452///
453/// # 错误
454/// - 非正数会抛出错误
455///
456/// # 示例
457/// ```aether
458/// Set e E()
459/// Set a Ln(e) # 1.0
460/// Set b Ln(1) # 0.0
461/// Set c Ln(e * e) # 2.0
462/// ```
463pub fn ln(args: &[Value]) -> Result<Value, RuntimeError> {
464 if args.len() != 1 {
465 return Err(RuntimeError::WrongArity {
466 expected: 1,
467 got: args.len(),
468 });
469 }
470
471 match &args[0] {
472 Value::Number(n) => {
473 if *n <= 0.0 {
474 return Err(RuntimeError::InvalidOperation(format!(
475 "Cannot take natural logarithm of non-positive number: {}",
476 n
477 )));
478 }
479 Ok(Value::Number(n.ln()))
480 }
481 _ => Err(RuntimeError::TypeErrorDetailed {
482 expected: "Number".to_string(),
483 got: format!("{:?}", args[0]),
484 }),
485 }
486}
487
488/// 自然指数函数
489///
490/// # 功能
491/// 计算 e 的 x 次幂。
492///
493/// # 参数
494/// - `x`: Number - 指数
495///
496/// # 返回值
497/// Number - e^x
498///
499/// # 公式
500/// ```
501/// exp(x) = e^x
502/// ```
503///
504/// # 示例
505/// ```aether
506/// Set a Exp(0) # 1.0
507/// Set b Exp(1) # 2.718281828... (e)
508/// Set c Exp(2) # 7.389056... (e²)
509/// ```
510pub fn exp(args: &[Value]) -> Result<Value, RuntimeError> {
511 if args.len() != 1 {
512 return Err(RuntimeError::WrongArity {
513 expected: 1,
514 got: args.len(),
515 });
516 }
517
518 match &args[0] {
519 Value::Number(n) => Ok(Value::Number(n.exp())),
520 _ => Err(RuntimeError::TypeErrorDetailed {
521 expected: "Number".to_string(),
522 got: format!("{:?}", args[0]),
523 }),
524 }
525}
526
527// ============================================================================
528// Advanced Trigonometric Functions
529// ============================================================================
530
531/// 反正弦函数
532///
533/// # 功能
534/// 计算正弦的反函数,返回角度(弧度)。
535///
536/// # 参数
537/// - `x`: Number - 正弦值,必须在 [-1, 1] 范围内
538///
539/// # 返回值
540/// Number - 角度(弧度),范围 [-π/2, π/2]
541///
542/// # 错误
543/// - 输入不在 [-1, 1] 范围时抛出错误
544///
545/// # 示例
546/// ```aether
547/// Set a Asin(0) # 0.0
548/// Set b Asin(1) # π/2 ≈ 1.5708
549/// Set c Asin(-1) # -π/2
550/// ```
551pub fn asin(args: &[Value]) -> Result<Value, RuntimeError> {
552 if args.len() != 1 {
553 return Err(RuntimeError::WrongArity {
554 expected: 1,
555 got: args.len(),
556 });
557 }
558
559 match &args[0] {
560 Value::Number(n) => {
561 if *n < -1.0 || *n > 1.0 {
562 return Err(RuntimeError::InvalidOperation(format!(
563 "asin domain error: argument must be in [-1, 1], got {}",
564 n
565 )));
566 }
567 Ok(Value::Number(n.asin()))
568 }
569 _ => Err(RuntimeError::TypeErrorDetailed {
570 expected: "Number".to_string(),
571 got: format!("{:?}", args[0]),
572 }),
573 }
574}
575
576/// 反余弦函数
577///
578/// # 功能
579/// 计算余弦的反函数,返回角度(弧度)。
580///
581/// # 参数
582/// - `x`: Number - 余弦值,必须在 [-1, 1] 范围内
583///
584/// # 返回值
585/// Number - 角度(弧度),范围 [0, π]
586///
587/// # 错误
588/// - 输入不在 [-1, 1] 范围时抛出错误
589///
590/// # 示例
591/// ```aether
592/// Set a Acos(1) # 0.0
593/// Set b Acos(0) # π/2 ≈ 1.5708
594/// Set c Acos(-1) # π ≈ 3.1416
595/// ```
596pub fn acos(args: &[Value]) -> Result<Value, RuntimeError> {
597 if args.len() != 1 {
598 return Err(RuntimeError::WrongArity {
599 expected: 1,
600 got: args.len(),
601 });
602 }
603
604 match &args[0] {
605 Value::Number(n) => {
606 if *n < -1.0 || *n > 1.0 {
607 return Err(RuntimeError::InvalidOperation(format!(
608 "acos domain error: argument must be in [-1, 1], got {}",
609 n
610 )));
611 }
612 Ok(Value::Number(n.acos()))
613 }
614 _ => Err(RuntimeError::TypeErrorDetailed {
615 expected: "Number".to_string(),
616 got: format!("{:?}", args[0]),
617 }),
618 }
619}
620
621/// 反正切函数
622///
623/// # 功能
624/// 计算正切的反函数,返回角度(弧度)。
625///
626/// # 参数
627/// - `x`: Number - 正切值
628///
629/// # 返回值
630/// Number - 角度(弧度),范围 (-π/2, π/2)
631///
632/// # 示例
633/// ```aether
634/// Set a Atan(0) # 0.0
635/// Set b Atan(1) # π/4 ≈ 0.7854
636/// Set c Atan(-1) # -π/4
637/// ```
638pub fn atan(args: &[Value]) -> Result<Value, RuntimeError> {
639 if args.len() != 1 {
640 return Err(RuntimeError::WrongArity {
641 expected: 1,
642 got: args.len(),
643 });
644 }
645
646 match &args[0] {
647 Value::Number(n) => Ok(Value::Number(n.atan())),
648 _ => Err(RuntimeError::TypeErrorDetailed {
649 expected: "Number".to_string(),
650 got: format!("{:?}", args[0]),
651 }),
652 }
653}
654
655/// 双参数反正切函数
656///
657/// # 功能
658/// 计算 y/x 的反正切,考虑象限,返回正确的角度。
659///
660/// # 参数
661/// - `y`: Number - y 坐标
662/// - `x`: Number - x 坐标
663///
664/// # 返回值
665/// Number - 角度(弧度),范围 [-π, π]
666///
667/// # 说明
668/// 相比 atan(y/x),atan2 能正确处理所有象限。
669///
670/// # 示例
671/// ```aether
672/// Set a Atan2(1, 1) # π/4 (第一象限)
673/// Set b Atan2(1, -1) # 3π/4 (第二象限)
674/// Set c Atan2(-1, -1) # -3π/4 (第三象限)
675/// Set d Atan2(-1, 1) # -π/4 (第四象限)
676/// ```
677pub fn atan2(args: &[Value]) -> Result<Value, RuntimeError> {
678 if args.len() != 2 {
679 return Err(RuntimeError::WrongArity {
680 expected: 2,
681 got: args.len(),
682 });
683 }
684
685 match (&args[0], &args[1]) {
686 (Value::Number(y), Value::Number(x)) => Ok(Value::Number(y.atan2(*x))),
687 _ => Err(RuntimeError::TypeErrorDetailed {
688 expected: "Number, Number".to_string(),
689 got: format!("{:?}, {:?}", args[0], args[1]),
690 }),
691 }
692}
693
694/// 双曲正弦函数
695///
696/// # 功能
697/// 计算双曲正弦值。
698///
699/// # 参数
700/// - `x`: Number - 输入值
701///
702/// # 返回值
703/// Number - sinh(x)
704///
705/// # 公式
706/// ```
707/// sinh(x) = (e^x - e^(-x)) / 2
708/// ```
709///
710/// # 示例
711/// ```aether
712/// Set a Sinh(0) # 0.0
713/// Set b Sinh(1) # 1.1752...
714/// ```
715pub fn sinh(args: &[Value]) -> Result<Value, RuntimeError> {
716 if args.len() != 1 {
717 return Err(RuntimeError::WrongArity {
718 expected: 1,
719 got: args.len(),
720 });
721 }
722
723 match &args[0] {
724 Value::Number(n) => Ok(Value::Number(n.sinh())),
725 _ => Err(RuntimeError::TypeErrorDetailed {
726 expected: "Number".to_string(),
727 got: format!("{:?}", args[0]),
728 }),
729 }
730}
731
732/// 双曲余弦函数
733///
734/// # 功能
735/// 计算双曲余弦值。
736///
737/// # 参数
738/// - `x`: Number - 输入值
739///
740/// # 返回值
741/// Number - cosh(x)
742///
743/// # 公式
744/// ```
745/// cosh(x) = (e^x + e^(-x)) / 2
746/// ```
747///
748/// # 示例
749/// ```aether
750/// Set a Cosh(0) # 1.0
751/// Set b Cosh(1) # 1.5431...
752/// ```
753pub fn cosh(args: &[Value]) -> Result<Value, RuntimeError> {
754 if args.len() != 1 {
755 return Err(RuntimeError::WrongArity {
756 expected: 1,
757 got: args.len(),
758 });
759 }
760
761 match &args[0] {
762 Value::Number(n) => Ok(Value::Number(n.cosh())),
763 _ => Err(RuntimeError::TypeErrorDetailed {
764 expected: "Number".to_string(),
765 got: format!("{:?}", args[0]),
766 }),
767 }
768}
769
770/// 双曲正切函数
771///
772/// # 功能
773/// 计算双曲正切值。
774///
775/// # 参数
776/// - `x`: Number - 输入值
777///
778/// # 返回值
779/// Number - tanh(x),范围 (-1, 1)
780///
781/// # 公式
782/// ```
783/// tanh(x) = sinh(x) / cosh(x) = (e^x - e^(-x)) / (e^x + e^(-x))
784/// ```
785///
786/// # 示例
787/// ```aether
788/// Set a Tanh(0) # 0.0
789/// Set b Tanh(1) # 0.7616...
790/// ```
791pub fn tanh(args: &[Value]) -> Result<Value, RuntimeError> {
792 if args.len() != 1 {
793 return Err(RuntimeError::WrongArity {
794 expected: 1,
795 got: args.len(),
796 });
797 }
798
799 match &args[0] {
800 Value::Number(n) => Ok(Value::Number(n.tanh())),
801 _ => Err(RuntimeError::TypeErrorDetailed {
802 expected: "Number".to_string(),
803 got: format!("{:?}", args[0]),
804 }),
805 }
806}
807
808// ============================================================================
809// Advanced Exponential and Logarithmic Functions
810// ============================================================================
811
812/// 以2为底的对数
813///
814/// # 功能
815/// 计算以 2 为底的对数。
816///
817/// # 参数
818/// - `x`: Number - 输入数字(必须 > 0)
819///
820/// # 返回值
821/// Number - log₂(x)
822///
823/// # 公式
824/// ```
825/// log₂(x) = y ⟺ 2^y = x
826/// ```
827///
828/// # 错误
829/// - 非正数会抛出错误
830///
831/// # 示例
832/// ```aether
833/// Set a Log2(2) # 1.0
834/// Set b Log2(8) # 3.0
835/// Set c Log2(1024) # 10.0
836/// ```
837pub fn log2(args: &[Value]) -> Result<Value, RuntimeError> {
838 if args.len() != 1 {
839 return Err(RuntimeError::WrongArity {
840 expected: 1,
841 got: args.len(),
842 });
843 }
844
845 match &args[0] {
846 Value::Number(n) => {
847 if *n <= 0.0 {
848 return Err(RuntimeError::InvalidOperation(format!(
849 "Cannot take log2 of non-positive number: {}",
850 n
851 )));
852 }
853 Ok(Value::Number(n.log2()))
854 }
855 _ => Err(RuntimeError::TypeErrorDetailed {
856 expected: "Number".to_string(),
857 got: format!("{:?}", args[0]),
858 }),
859 }
860}
861
862/// 2的幂运算
863///
864/// # 功能
865/// 计算 2 的 x 次幂。
866///
867/// # 参数
868/// - `x`: Number - 指数
869///
870/// # 返回值
871/// Number - 2^x
872///
873/// # 公式
874/// ```
875/// exp2(x) = 2^x
876/// ```
877///
878/// # 示例
879/// ```aether
880/// Set a Exp2(3) # 8.0
881/// Set b Exp2(10) # 1024.0
882/// Set c Exp2(-1) # 0.5
883/// ```
884pub fn exp2(args: &[Value]) -> Result<Value, RuntimeError> {
885 if args.len() != 1 {
886 return Err(RuntimeError::WrongArity {
887 expected: 1,
888 got: args.len(),
889 });
890 }
891
892 match &args[0] {
893 Value::Number(n) => Ok(Value::Number(n.exp2())),
894 _ => Err(RuntimeError::TypeErrorDetailed {
895 expected: "Number".to_string(),
896 got: format!("{:?}", args[0]),
897 }),
898 }
899}
900
901/// exp(x) - 1 精确计算
902///
903/// # 功能
904/// 计算 e^x - 1,对于接近 0 的 x 值更精确。
905///
906/// # 参数
907/// - `x`: Number - 指数
908///
909/// # 返回值
910/// Number - e^x - 1
911///
912/// # 说明
913/// 当 x 接近 0 时,直接计算 exp(x) - 1 会有精度损失,此函数使用特殊算法避免这个问题。
914///
915/// # 示例
916/// ```aether
917/// Set a Expm1(0) # 0.0
918/// Set b Expm1(0.001) # 0.0010005...
919/// ```
920pub fn expm1(args: &[Value]) -> Result<Value, RuntimeError> {
921 if args.len() != 1 {
922 return Err(RuntimeError::WrongArity {
923 expected: 1,
924 got: args.len(),
925 });
926 }
927
928 match &args[0] {
929 Value::Number(n) => Ok(Value::Number(n.exp_m1())),
930 _ => Err(RuntimeError::TypeErrorDetailed {
931 expected: "Number".to_string(),
932 got: format!("{:?}", args[0]),
933 }),
934 }
935}
936
937/// ln(1 + x) 精确计算
938///
939/// # 功能
940/// 计算 ln(1 + x),对于接近 0 的 x 值更精确。
941///
942/// # 参数
943/// - `x`: Number - 输入值(必须 > -1)
944///
945/// # 返回值
946/// Number - ln(1 + x)
947///
948/// # 错误
949/// - x ≤ -1 时抛出错误
950///
951/// # 说明
952/// 当 x 接近 0 时,直接计算 ln(1 + x) 会有精度损失,此函数使用特殊算法避免这个问题。
953///
954/// # 示例
955/// ```aether
956/// Set a Log1p(0) # 0.0
957/// Set b Log1p(0.001) # 0.0009995...
958/// ```
959pub fn log1p(args: &[Value]) -> Result<Value, RuntimeError> {
960 if args.len() != 1 {
961 return Err(RuntimeError::WrongArity {
962 expected: 1,
963 got: args.len(),
964 });
965 }
966
967 match &args[0] {
968 Value::Number(n) => {
969 if *n <= -1.0 {
970 return Err(RuntimeError::InvalidOperation(format!(
971 "log1p domain error: argument must be > -1, got {}",
972 n
973 )));
974 }
975 Ok(Value::Number(n.ln_1p()))
976 }
977 _ => Err(RuntimeError::TypeErrorDetailed {
978 expected: "Number".to_string(),
979 got: format!("{:?}", args[0]),
980 }),
981 }
982}
983
984// ============================================================================
985// Special Mathematical Functions
986// ============================================================================
987
988/// 阶乘
989///
990/// # 功能
991/// 计算非负整数的阶乘。
992///
993/// # 参数
994/// - `n`: Number - 非负整数
995///
996/// # 返回值
997/// Number - n! = n × (n-1) × ... × 2 × 1
998///
999/// # 公式
1000/// ```
1001/// 0! = 1
1002/// n! = n × (n-1)! (n > 0)
1003/// ```
1004///
1005/// # 错误
1006/// - 非整数或负数会抛出错误
1007/// - n > 170 会溢出
1008///
1009/// # 示例
1010/// ```aether
1011/// Set a Factorial(0) # 1
1012/// Set b Factorial(5) # 120
1013/// Set c Factorial(10) # 3628800
1014/// ```
1015pub fn factorial(args: &[Value]) -> Result<Value, RuntimeError> {
1016 if args.len() != 1 {
1017 return Err(RuntimeError::WrongArity {
1018 expected: 1,
1019 got: args.len(),
1020 });
1021 }
1022
1023 match &args[0] {
1024 Value::Number(n) => {
1025 if *n < 0.0 || n.fract() != 0.0 {
1026 return Err(RuntimeError::InvalidOperation(format!(
1027 "Factorial requires non-negative integer, got {}",
1028 n
1029 )));
1030 }
1031
1032 let n_int = *n as u32;
1033 if n_int > 170 {
1034 return Err(RuntimeError::InvalidOperation(format!(
1035 "Factorial overflow: {} is too large",
1036 n_int
1037 )));
1038 }
1039
1040 let mut result = 1.0;
1041 for i in 2..=n_int {
1042 result *= i as f64;
1043 }
1044 Ok(Value::Number(result))
1045 }
1046 _ => Err(RuntimeError::TypeErrorDetailed {
1047 expected: "Number".to_string(),
1048 got: format!("{:?}", args[0]),
1049 }),
1050 }
1051}
1052
1053/// Gamma 函数(广义阶乘)
1054///
1055/// # 功能
1056/// 计算 Gamma 函数,是阶乘的连续扩展。
1057///
1058/// # 参数
1059/// - `x`: Number - 输入值
1060///
1061/// # 返回值
1062/// Number - Γ(x)
1063///
1064/// # 公式
1065/// ```
1066/// Γ(n) = (n-1)! (n为正整数)
1067/// Γ(x) ≈ √(2π/x) × (x/e)^x (Stirling近似)
1068/// ```
1069///
1070/// # 错误
1071/// - 非正整数会抛出错误
1072///
1073/// # 示例
1074/// ```aether
1075/// Set a Gamma(1) # 1 (0!)
1076/// Set b Gamma(5) # 24 (4!)
1077/// Set c Gamma(0.5) # √π ≈ 1.77245
1078/// ```
1079pub fn gamma(args: &[Value]) -> Result<Value, RuntimeError> {
1080 if args.len() != 1 {
1081 return Err(RuntimeError::WrongArity {
1082 expected: 1,
1083 got: args.len(),
1084 });
1085 }
1086
1087 match &args[0] {
1088 Value::Number(n) => {
1089 // Using Stirling's approximation for gamma function
1090 // Gamma(x) ≈ sqrt(2*pi/x) * (x/e)^x
1091 if *n <= 0.0 && n.fract() == 0.0 {
1092 return Err(RuntimeError::InvalidOperation(format!(
1093 "Gamma function undefined for non-positive integers: {}",
1094 n
1095 )));
1096 }
1097
1098 // For integers, use factorial
1099 if n.fract() == 0.0 && *n > 0.0 {
1100 return factorial(&[Value::Number(*n - 1.0)]);
1101 }
1102
1103 // Stirling's approximation
1104 let x = *n;
1105 let result = (2.0 * consts::PI / x).sqrt() * (x / consts::E).powf(x);
1106 Ok(Value::Number(result))
1107 }
1108 _ => Err(RuntimeError::TypeErrorDetailed {
1109 expected: "Number".to_string(),
1110 got: format!("{:?}", args[0]),
1111 }),
1112 }
1113}
1114
1115/// 误差函数
1116///
1117/// # 功能
1118/// 计算高斯误差函数,常用于概率和统计。
1119///
1120/// # 参数
1121/// - `x`: Number - 输入值
1122///
1123/// # 返回值
1124/// Number - erf(x),范围 (-1, 1)
1125///
1126/// # 公式
1127/// ```
1128/// erf(x) = (2/√π) ∫₀ˣ e^(-t²) dt
1129/// ```
1130///
1131/// # 应用
1132/// - 正态分布累积分布函数
1133/// - 概率计算
1134///
1135/// # 示例
1136/// ```aether
1137/// Set a Erf(0) # 0.0
1138/// Set b Erf(1) # 0.8427... (约84.27%概率)
1139/// Set c Erf(-1) # -0.8427...
1140/// ```
1141pub fn erf(args: &[Value]) -> Result<Value, RuntimeError> {
1142 if args.len() != 1 {
1143 return Err(RuntimeError::WrongArity {
1144 expected: 1,
1145 got: args.len(),
1146 });
1147 }
1148
1149 match &args[0] {
1150 Value::Number(x) => {
1151 // Abramowitz and Stegun approximation
1152 let a1 = 0.254829592;
1153 let a2 = -0.284496736;
1154 let a3 = 1.421413741;
1155 let a4 = -1.453152027;
1156 let a5 = 1.061405429;
1157 let p = 0.3275911;
1158
1159 let sign = if *x < 0.0 { -1.0 } else { 1.0 };
1160 let x_abs = x.abs();
1161
1162 let t = 1.0 / (1.0 + p * x_abs);
1163 let y =
1164 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * (-x_abs * x_abs).exp();
1165
1166 Ok(Value::Number(sign * y))
1167 }
1168 _ => Err(RuntimeError::TypeErrorDetailed {
1169 expected: "Number".to_string(),
1170 got: format!("{:?}", args[0]),
1171 }),
1172 }
1173}
1174
1175/// 斜边长度(勾股定理)
1176///
1177/// # 功能
1178/// 计算直角三角形的斜边长度,即 √(x² + y²)。
1179///
1180/// # 参数
1181/// - `x`: Number - 直角边 x
1182/// - `y`: Number - 直角边 y
1183///
1184/// # 返回值
1185/// Number - 斜边长度
1186///
1187/// # 公式
1188/// ```
1189/// hypot(x, y) = √(x² + y²)
1190/// ```
1191///
1192/// # 说明
1193/// 使用特殊算法避免中间计算溢出。
1194///
1195/// # 示例
1196/// ```aether
1197/// Set c Hypot(3, 4) # 5.0
1198/// Set c Hypot(5, 12) # 13.0
1199/// Set dist Hypot(1, 1) # √2 ≈ 1.414
1200/// ```
1201pub fn hypot(args: &[Value]) -> Result<Value, RuntimeError> {
1202 if args.len() != 2 {
1203 return Err(RuntimeError::WrongArity {
1204 expected: 2,
1205 got: args.len(),
1206 });
1207 }
1208
1209 match (&args[0], &args[1]) {
1210 (Value::Number(x), Value::Number(y)) => Ok(Value::Number(x.hypot(*y))),
1211 _ => Err(RuntimeError::TypeErrorDetailed {
1212 expected: "Number, Number".to_string(),
1213 got: format!("{:?}, {:?}", args[0], args[1]),
1214 }),
1215 }
1216}
1217
1218/// 符号函数
1219///
1220/// # 功能
1221/// 返回数字的符号:正数返回 1,负数返回 -1,零返回 0。
1222///
1223/// # 参数
1224/// - `x`: Number - 输入数字
1225///
1226/// # 返回值
1227/// Number - 1、0 或 -1
1228///
1229/// # 公式
1230/// ```
1231/// sign(x) = { -1 if x < 0
1232/// { 0 if x = 0
1233/// { 1 if x > 0
1234/// ```
1235///
1236/// # 示例
1237/// ```aether
1238/// Set a Sign(5) # 1
1239/// Set b Sign(-3.14) # -1
1240/// Set c Sign(0) # 0
1241/// ```
1242pub fn sign(args: &[Value]) -> Result<Value, RuntimeError> {
1243 if args.len() != 1 {
1244 return Err(RuntimeError::WrongArity {
1245 expected: 1,
1246 got: args.len(),
1247 });
1248 }
1249
1250 match &args[0] {
1251 Value::Number(n) => {
1252 let result = if *n > 0.0 {
1253 1.0
1254 } else if *n < 0.0 {
1255 -1.0
1256 } else {
1257 0.0
1258 };
1259 Ok(Value::Number(result))
1260 }
1261 _ => Err(RuntimeError::TypeErrorDetailed {
1262 expected: "Number".to_string(),
1263 got: format!("{:?}", args[0]),
1264 }),
1265 }
1266}
1267
1268/// 限制值在指定范围内
1269///
1270/// # 功能
1271/// 将数值限制在指定的最小值和最大值之间。
1272///
1273/// # 参数
1274/// - `x`: Number - 要限制的值
1275/// - `min`: Number - 最小值
1276/// - `max`: Number - 最大值
1277///
1278/// # 返回值
1279/// Number - 限制后的值
1280///
1281/// # 公式
1282/// ```
1283/// clamp(x, min, max) = { min if x < min
1284/// { x if min ≤ x ≤ max
1285/// { max if x > max
1286/// ```
1287///
1288/// # 错误
1289/// - min > max 时抛出错误
1290///
1291/// # 示例
1292/// ```aether
1293/// Set a Clamp(5, 0, 10) # 5 (在范围内)
1294/// Set b Clamp(-5, 0, 10) # 0 (小于min)
1295/// Set c Clamp(15, 0, 10) # 10 (大于max)
1296/// ```
1297pub fn clamp(args: &[Value]) -> Result<Value, RuntimeError> {
1298 if args.len() != 3 {
1299 return Err(RuntimeError::WrongArity {
1300 expected: 3,
1301 got: args.len(),
1302 });
1303 }
1304
1305 match (&args[0], &args[1], &args[2]) {
1306 (Value::Number(x), Value::Number(min), Value::Number(max)) => {
1307 if min > max {
1308 return Err(RuntimeError::InvalidOperation(format!(
1309 "Clamp: min ({}) must be <= max ({})",
1310 min, max
1311 )));
1312 }
1313 Ok(Value::Number(x.clamp(*min, *max)))
1314 }
1315 _ => Err(RuntimeError::TypeErrorDetailed {
1316 expected: "Number, Number, Number".to_string(),
1317 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
1318 }),
1319 }
1320}
1321
1322// ============================================================================
1323// Statistics Functions
1324// ============================================================================
1325
1326/// 计算平均值(均值)
1327///
1328/// # 功能
1329/// 计算数字数组的算术平均值。
1330///
1331/// # 参数
1332/// - `array`: Array - 数字数组
1333///
1334/// # 返回值
1335/// Number - 平均值
1336///
1337/// # 公式
1338/// ```
1339/// mean = (x₁ + x₂ + ... + xₙ) / n
1340/// ```
1341///
1342/// # 错误
1343/// - 空数组会抛出错误
1344/// - 数组包含非数字元素时抛出类型错误
1345///
1346/// # 示例
1347/// ```aether
1348/// Set scores [85, 90, 78, 92, 88]
1349/// Set avg Mean(scores) # 86.6
1350/// Set temps [20.5, 22.0, 21.5, 19.5]
1351/// Set avg Mean(temps) # 20.875
1352/// ```
1353pub fn mean(args: &[Value]) -> Result<Value, RuntimeError> {
1354 if args.len() != 1 {
1355 return Err(RuntimeError::WrongArity {
1356 expected: 1,
1357 got: args.len(),
1358 });
1359 }
1360
1361 match &args[0] {
1362 Value::Array(arr) => {
1363 if arr.is_empty() {
1364 return Err(RuntimeError::InvalidOperation(
1365 "Cannot compute mean of empty array".to_string(),
1366 ));
1367 }
1368
1369 let mut sum = 0.0;
1370 for val in arr {
1371 match val {
1372 Value::Number(n) => sum += n,
1373 _ => {
1374 return Err(RuntimeError::TypeErrorDetailed {
1375 expected: "Array of Numbers".to_string(),
1376 got: format!("Array containing {:?}", val),
1377 })
1378 }
1379 }
1380 }
1381 Ok(Value::Number(sum / arr.len() as f64))
1382 }
1383 _ => Err(RuntimeError::TypeErrorDetailed {
1384 expected: "Array".to_string(),
1385 got: format!("{:?}", args[0]),
1386 }),
1387 }
1388}
1389
1390/// 计算中位数
1391///
1392/// # 功能
1393/// 计算数字数组的中位数(排序后的中间值)。
1394///
1395/// # 参数
1396/// - `array`: Array - 数字数组
1397///
1398/// # 返回值
1399/// Number - 中位数
1400///
1401/// # 规则
1402/// - 奇数个元素:返回中间的值
1403/// - 偶数个元素:返回中间两个值的平均
1404///
1405/// # 错误
1406/// - 空数组会抛出错误
1407///
1408/// # 示例
1409/// ```aether
1410/// Set nums [1, 3, 5, 7, 9]
1411/// Set med Median(nums) # 5 (中间值)
1412/// Set nums [1, 2, 3, 4]
1413/// Set med Median(nums) # 2.5 ((2+3)/2)
1414/// ```
1415pub fn median(args: &[Value]) -> Result<Value, RuntimeError> {
1416 if args.len() != 1 {
1417 return Err(RuntimeError::WrongArity {
1418 expected: 1,
1419 got: args.len(),
1420 });
1421 }
1422
1423 match &args[0] {
1424 Value::Array(arr) => {
1425 if arr.is_empty() {
1426 return Err(RuntimeError::InvalidOperation(
1427 "Cannot compute median of empty array".to_string(),
1428 ));
1429 }
1430
1431 let mut numbers: Vec<f64> = Vec::new();
1432 for val in arr {
1433 match val {
1434 Value::Number(n) => numbers.push(*n),
1435 _ => {
1436 return Err(RuntimeError::TypeErrorDetailed {
1437 expected: "Array of Numbers".to_string(),
1438 got: format!("Array containing {:?}", val),
1439 })
1440 }
1441 }
1442 }
1443
1444 numbers.sort_by(|a, b| a.partial_cmp(b).unwrap());
1445 let mid = numbers.len() / 2;
1446
1447 let result = if numbers.len() % 2 == 0 {
1448 (numbers[mid - 1] + numbers[mid]) / 2.0
1449 } else {
1450 numbers[mid]
1451 };
1452
1453 Ok(Value::Number(result))
1454 }
1455 _ => Err(RuntimeError::TypeErrorDetailed {
1456 expected: "Array".to_string(),
1457 got: format!("{:?}", args[0]),
1458 }),
1459 }
1460}
1461
1462/// 计算方差
1463///
1464/// # 功能
1465/// 计算数字数组的样本方差(数据分散程度的度量)。
1466///
1467/// # 参数
1468/// - `array`: Array - 数字数组
1469///
1470/// # 返回值
1471/// Number - 样本方差
1472///
1473/// # 公式
1474/// ```
1475/// variance = Σ(xᵢ - mean)² / (n - 1)
1476/// ```
1477///
1478/// # 错误
1479/// - 少于 2 个元素时抛出错误
1480///
1481/// # 示例
1482/// ```aether
1483/// Set data [2, 4, 6, 8, 10]
1484/// Set var Variance(data) # 10.0
1485/// Set scores [85, 90, 78]
1486/// Set var Variance(scores) # 36.0
1487/// ```
1488pub fn variance(args: &[Value]) -> Result<Value, RuntimeError> {
1489 if args.len() != 1 {
1490 return Err(RuntimeError::WrongArity {
1491 expected: 1,
1492 got: args.len(),
1493 });
1494 }
1495
1496 match &args[0] {
1497 Value::Array(arr) => {
1498 if arr.len() < 2 {
1499 return Err(RuntimeError::InvalidOperation(
1500 "Variance requires at least 2 values".to_string(),
1501 ));
1502 }
1503
1504 // Calculate mean
1505 let mean_result = mean(args)?;
1506 let mean_val = match mean_result {
1507 Value::Number(n) => n,
1508 _ => unreachable!(),
1509 };
1510
1511 // Calculate variance
1512 let mut sum_sq_diff = 0.0;
1513 for val in arr {
1514 match val {
1515 Value::Number(n) => {
1516 let diff = n - mean_val;
1517 sum_sq_diff += diff * diff;
1518 }
1519 _ => {
1520 return Err(RuntimeError::TypeErrorDetailed {
1521 expected: "Array of Numbers".to_string(),
1522 got: format!("Array containing {:?}", val),
1523 })
1524 }
1525 }
1526 }
1527
1528 Ok(Value::Number(sum_sq_diff / (arr.len() - 1) as f64))
1529 }
1530 _ => Err(RuntimeError::TypeErrorDetailed {
1531 expected: "Array".to_string(),
1532 got: format!("{:?}", args[0]),
1533 }),
1534 }
1535}
1536
1537/// 计算标准差
1538///
1539/// # 功能
1540/// 计算数字数组的样本标准差(方差的平方根)。
1541///
1542/// # 参数
1543/// - `array`: Array - 数字数组
1544///
1545/// # 返回值
1546/// Number - 样本标准差
1547///
1548/// # 公式
1549/// ```
1550/// std = √variance = √[Σ(xᵢ - mean)² / (n - 1)]
1551/// ```
1552///
1553/// # 错误
1554/// - 少于 2 个元素时抛出错误
1555///
1556/// # 示例
1557/// ```aether
1558/// Set data [2, 4, 6, 8, 10]
1559/// Set sd Std(data) # 3.162...
1560/// Set scores [85, 90, 78]
1561/// Set sd Std(scores) # 6.0
1562/// ```
1563pub fn std(args: &[Value]) -> Result<Value, RuntimeError> {
1564 let var = variance(args)?;
1565 match var {
1566 Value::Number(v) => Ok(Value::Number(v.sqrt())),
1567 _ => unreachable!(),
1568 }
1569}
1570
1571/// 计算分位数(百分位数)
1572///
1573/// # 功能
1574/// 计算数组的指定分位数。
1575///
1576/// # 参数
1577/// - `array`: Array - 数字数组
1578/// - `q`: Number - 分位数,范围 [0, 1]
1579///
1580/// # 返回值
1581/// Number - 第 q 分位数的值
1582///
1583/// # 说明
1584/// - 0.0 返回最小值
1585/// - 0.5 返回中位数
1586/// - 1.0 返回最大值
1587/// - 使用线性插值
1588///
1589/// # 错误
1590/// - 空数组或 q 不在 [0, 1] 范围时抛出错误
1591///
1592/// # 示例
1593/// ```aether
1594/// Set data [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1595/// Set q25 Quantile(data, 0.25) # 3.25 (第一四分位数)
1596/// Set q50 Quantile(data, 0.5) # 5.5 (中位数)
1597/// Set q75 Quantile(data, 0.75) # 7.75 (第三四分位数)
1598/// ```
1599pub fn quantile(args: &[Value]) -> Result<Value, RuntimeError> {
1600 if args.len() != 2 {
1601 return Err(RuntimeError::WrongArity {
1602 expected: 2,
1603 got: args.len(),
1604 });
1605 }
1606
1607 match (&args[0], &args[1]) {
1608 (Value::Array(arr), Value::Number(q)) => {
1609 if arr.is_empty() {
1610 return Err(RuntimeError::InvalidOperation(
1611 "Cannot compute quantile of empty array".to_string(),
1612 ));
1613 }
1614
1615 if *q < 0.0 || *q > 1.0 {
1616 return Err(RuntimeError::InvalidOperation(format!(
1617 "Quantile must be in [0, 1], got {}",
1618 q
1619 )));
1620 }
1621
1622 let mut numbers: Vec<f64> = Vec::new();
1623 for val in arr {
1624 match val {
1625 Value::Number(n) => numbers.push(*n),
1626 _ => {
1627 return Err(RuntimeError::TypeErrorDetailed {
1628 expected: "Array of Numbers".to_string(),
1629 got: format!("Array containing {:?}", val),
1630 })
1631 }
1632 }
1633 }
1634
1635 numbers.sort_by(|a, b| a.partial_cmp(b).unwrap());
1636
1637 let index = q * (numbers.len() - 1) as f64;
1638 let lower = index.floor() as usize;
1639 let upper = index.ceil() as usize;
1640
1641 let result = if lower == upper {
1642 numbers[lower]
1643 } else {
1644 let weight = index - lower as f64;
1645 numbers[lower] * (1.0 - weight) + numbers[upper] * weight
1646 };
1647
1648 Ok(Value::Number(result))
1649 }
1650 _ => Err(RuntimeError::TypeErrorDetailed {
1651 expected: "Array, Number".to_string(),
1652 got: format!("{:?}, {:?}", args[0], args[1]),
1653 }),
1654 }
1655}
1656
1657// ============================================================================
1658// Vector Operations (NumPy-like)
1659// ============================================================================
1660
1661/// 向量点积
1662///
1663/// # 功能
1664/// 计算两个向量的点积(内积)。
1665///
1666/// # 参数
1667/// - `a`: Array - 第一个向量(数字数组)
1668/// - `b`: Array - 第二个向量(数字数组)
1669///
1670/// # 返回值
1671/// Number - 点积结果
1672///
1673/// # 公式
1674/// ```
1675/// dot(a, b) = a₁b₁ + a₂b₂ + ... + aₙbₙ
1676/// ```
1677///
1678/// # 错误
1679/// - 两个向量长度不同时抛出错误
1680///
1681/// # 示例
1682/// ```aether
1683/// Set a [1, 2, 3]
1684/// Set b [4, 5, 6]
1685/// Set d Dot(a, b) # 32 (1*4 + 2*5 + 3*6)
1686/// Set v1 [1, 0, 0]
1687/// Set v2 [0, 1, 0]
1688/// Set d Dot(v1, v2) # 0 (正交向量)
1689/// ```
1690pub fn dot(args: &[Value]) -> Result<Value, RuntimeError> {
1691 if args.len() != 2 {
1692 return Err(RuntimeError::WrongArity {
1693 expected: 2,
1694 got: args.len(),
1695 });
1696 }
1697
1698 match (&args[0], &args[1]) {
1699 (Value::Array(a), Value::Array(b)) => {
1700 if a.len() != b.len() {
1701 return Err(RuntimeError::InvalidOperation(format!(
1702 "Dot product requires equal length vectors: {} vs {}",
1703 a.len(),
1704 b.len()
1705 )));
1706 }
1707
1708 let mut result = 0.0;
1709 for (val_a, val_b) in a.iter().zip(b.iter()) {
1710 match (val_a, val_b) {
1711 (Value::Number(na), Value::Number(nb)) => result += na * nb,
1712 _ => {
1713 return Err(RuntimeError::TypeErrorDetailed {
1714 expected: "Array of Numbers".to_string(),
1715 got: format!("Arrays containing {:?} and {:?}", val_a, val_b),
1716 })
1717 }
1718 }
1719 }
1720
1721 Ok(Value::Number(result))
1722 }
1723 _ => Err(RuntimeError::TypeErrorDetailed {
1724 expected: "Array, Array".to_string(),
1725 got: format!("{:?}, {:?}", args[0], args[1]),
1726 }),
1727 }
1728}
1729
1730/// 向量范数(模长)
1731///
1732/// # 功能
1733/// 计算向量的欧几里得范数(L2范数、模长、大小)。
1734///
1735/// # 参数
1736/// - `vector`: Array - 向量(数字数组)
1737///
1738/// # 返回值
1739/// Number - 向量的模长
1740///
1741/// # 公式
1742/// ```
1743/// ||v|| = √(v₁² + v₂² + ... + vₙ²)
1744/// ```
1745///
1746/// # 示例
1747/// ```aether
1748/// Set v [3, 4]
1749/// Set len Norm(v) # 5.0 (√(3²+4²))
1750/// Set v [1, 1, 1]
1751/// Set len Norm(v) # 1.732... (√3)
1752/// ```
1753pub fn norm(args: &[Value]) -> Result<Value, RuntimeError> {
1754 if args.len() != 1 {
1755 return Err(RuntimeError::WrongArity {
1756 expected: 1,
1757 got: args.len(),
1758 });
1759 }
1760
1761 match &args[0] {
1762 Value::Array(arr) => {
1763 let mut sum_sq = 0.0;
1764 for val in arr {
1765 match val {
1766 Value::Number(n) => sum_sq += n * n,
1767 _ => {
1768 return Err(RuntimeError::TypeErrorDetailed {
1769 expected: "Array of Numbers".to_string(),
1770 got: format!("Array containing {:?}", val),
1771 })
1772 }
1773 }
1774 }
1775 Ok(Value::Number(sum_sq.sqrt()))
1776 }
1777 _ => Err(RuntimeError::TypeErrorDetailed {
1778 expected: "Array".to_string(),
1779 got: format!("{:?}", args[0]),
1780 }),
1781 }
1782}
1783
1784/// 向量叉积
1785///
1786/// # 功能
1787/// 计算两个三维向量的叉积(外积)。
1788///
1789/// # 参数
1790/// - `a`: Array - 第一个3D向量 [x₁, y₁, z₁]
1791/// - `b`: Array - 第二个3D向量 [x₂, y₂, z₂]
1792///
1793/// # 返回值
1794/// Array - 叉积向量,垂直于输入的两个向量
1795///
1796/// # 公式
1797/// ```
1798/// a × b = [a₂b₃ - a₃b₂, a₃b₁ - a₁b₃, a₁b₂ - a₂b₁]
1799/// ```
1800///
1801/// # 错误
1802/// - 输入不是3D向量时抛出错误
1803///
1804/// # 示例
1805/// ```aether
1806/// Set a [1, 0, 0]
1807/// Set b [0, 1, 0]
1808/// Set c Cross(a, b) # [0, 0, 1] (z轴方向)
1809/// Set a [1, 2, 3]
1810/// Set b [4, 5, 6]
1811/// Set c Cross(a, b) # [-3, 6, -3]
1812/// ```
1813pub fn cross(args: &[Value]) -> Result<Value, RuntimeError> {
1814 if args.len() != 2 {
1815 return Err(RuntimeError::WrongArity {
1816 expected: 2,
1817 got: args.len(),
1818 });
1819 }
1820
1821 match (&args[0], &args[1]) {
1822 (Value::Array(a), Value::Array(b)) => {
1823 if a.len() != 3 || b.len() != 3 {
1824 return Err(RuntimeError::InvalidOperation(
1825 "Cross product requires 3D vectors".to_string(),
1826 ));
1827 }
1828
1829 let (a1, a2, a3) = match (&a[0], &a[1], &a[2]) {
1830 (Value::Number(x), Value::Number(y), Value::Number(z)) => (*x, *y, *z),
1831 _ => {
1832 return Err(RuntimeError::TypeErrorDetailed {
1833 expected: "Array of Numbers".to_string(),
1834 got: format!("Array containing non-numbers"),
1835 })
1836 }
1837 };
1838
1839 let (b1, b2, b3) = match (&b[0], &b[1], &b[2]) {
1840 (Value::Number(x), Value::Number(y), Value::Number(z)) => (*x, *y, *z),
1841 _ => {
1842 return Err(RuntimeError::TypeErrorDetailed {
1843 expected: "Array of Numbers".to_string(),
1844 got: format!("Array containing non-numbers"),
1845 })
1846 }
1847 };
1848
1849 Ok(Value::Array(vec![
1850 Value::Number(a2 * b3 - a3 * b2),
1851 Value::Number(a3 * b1 - a1 * b3),
1852 Value::Number(a1 * b2 - a2 * b1),
1853 ]))
1854 }
1855 _ => Err(RuntimeError::TypeErrorDetailed {
1856 expected: "Array, Array".to_string(),
1857 got: format!("{:?}, {:?}", args[0], args[1]),
1858 }),
1859 }
1860}
1861
1862/// 向量间的欧几里得距离
1863///
1864/// # 功能
1865/// 计算两个向量之间的欧几里得距离。
1866///
1867/// # 参数
1868/// - `a`: Array - 第一个向量
1869/// - `b`: Array - 第二个向量
1870///
1871/// # 返回值
1872/// Number - 欧几里得距离
1873///
1874/// # 公式
1875/// ```
1876/// distance(a, b) = ||a - b|| = √(Σ(aᵢ - bᵢ)²)
1877/// ```
1878///
1879/// # 错误
1880/// - 两个向量长度不同时抛出错误
1881///
1882/// # 示例
1883/// ```aether
1884/// Set p1 [0, 0]
1885/// Set p2 [3, 4]
1886/// Set d Distance(p1, p2) # 5.0
1887/// Set a [1, 2, 3]
1888/// Set b [4, 5, 6]
1889/// Set d Distance(a, b) # 5.196... (√27)
1890/// ```
1891pub fn distance(args: &[Value]) -> Result<Value, RuntimeError> {
1892 if args.len() != 2 {
1893 return Err(RuntimeError::WrongArity {
1894 expected: 2,
1895 got: args.len(),
1896 });
1897 }
1898
1899 match (&args[0], &args[1]) {
1900 (Value::Array(a), Value::Array(b)) => {
1901 if a.len() != b.len() {
1902 return Err(RuntimeError::InvalidOperation(format!(
1903 "Distance requires equal length vectors: {} vs {}",
1904 a.len(),
1905 b.len()
1906 )));
1907 }
1908
1909 let mut sum_sq = 0.0;
1910 for (val_a, val_b) in a.iter().zip(b.iter()) {
1911 match (val_a, val_b) {
1912 (Value::Number(na), Value::Number(nb)) => {
1913 let diff = na - nb;
1914 sum_sq += diff * diff;
1915 }
1916 _ => {
1917 return Err(RuntimeError::TypeErrorDetailed {
1918 expected: "Array of Numbers".to_string(),
1919 got: format!("Arrays containing {:?} and {:?}", val_a, val_b),
1920 })
1921 }
1922 }
1923 }
1924
1925 Ok(Value::Number(sum_sq.sqrt()))
1926 }
1927 _ => Err(RuntimeError::TypeErrorDetailed {
1928 expected: "Array, Array".to_string(),
1929 got: format!("{:?}, {:?}", args[0], args[1]),
1930 }),
1931 }
1932}
1933
1934/// 向量归一化
1935///
1936/// # 功能
1937/// 将向量归一化为单位向量(模长为1)。
1938///
1939/// # 参数
1940/// - `vector`: Array - 输入向量
1941///
1942/// # 返回值
1943/// Array - 归一化后的单位向量
1944///
1945/// # 公式
1946/// ```
1947/// normalize(v) = v / ||v||
1948/// ```
1949///
1950/// # 错误
1951/// - 零向量无法归一化
1952///
1953/// # 示例
1954/// ```aether
1955/// Set v [3, 4]
1956/// Set unit Normalize(v) # [0.6, 0.8]
1957/// Set v [1, 1, 1]
1958/// Set unit Normalize(v) # [0.577..., 0.577..., 0.577...]
1959/// ```
1960pub fn normalize(args: &[Value]) -> Result<Value, RuntimeError> {
1961 if args.len() != 1 {
1962 return Err(RuntimeError::WrongArity {
1963 expected: 1,
1964 got: args.len(),
1965 });
1966 }
1967
1968 let norm_result = norm(args)?;
1969 let norm_val = match norm_result {
1970 Value::Number(n) => n,
1971 _ => unreachable!(),
1972 };
1973
1974 if norm_val == 0.0 {
1975 return Err(RuntimeError::InvalidOperation(
1976 "Cannot normalize zero vector".to_string(),
1977 ));
1978 }
1979
1980 match &args[0] {
1981 Value::Array(arr) => {
1982 let normalized: Vec<Value> = arr
1983 .iter()
1984 .map(|v| {
1985 match v {
1986 Value::Number(n) => Value::Number(n / norm_val),
1987 _ => unreachable!(), // Already validated in norm()
1988 }
1989 })
1990 .collect();
1991
1992 Ok(Value::Array(normalized))
1993 }
1994 _ => unreachable!(), // Already validated in norm()
1995 }
1996}
1997
1998// ============================================================================
1999// Matrix Operations (NumPy-like)
2000// ============================================================================
2001
2002/// 矩阵乘法
2003///
2004/// # 功能
2005/// 计算两个矩阵的乘积。
2006///
2007/// # 参数
2008/// - `A`: Array - 第一个矩阵(二维数组)[m × n]
2009/// - `B`: Array - 第二个矩阵(二维数组)[n × p]
2010///
2011/// # 返回值
2012/// Array - 矩阵乘积 [m × p]
2013///
2014/// # 公式
2015/// ```
2016/// C[i][j] = Σ A[i][k] × B[k][j] (k = 0 to n-1)
2017/// ```
2018///
2019/// # 错误
2020/// - A的列数必须等于B的行数
2021///
2022/// # 示例
2023/// ```aether
2024/// Set A [[1, 2], [3, 4]]
2025/// Set B [[5, 6], [7, 8]]
2026/// Set C Matmul(A, B) # [[19, 22], [43, 50]]
2027/// Set I [[1, 0], [0, 1]]
2028/// Set R Matmul(A, I) # [[1, 2], [3, 4]] (单位矩阵)
2029/// ```
2030pub fn matmul(args: &[Value]) -> Result<Value, RuntimeError> {
2031 if args.len() != 2 {
2032 return Err(RuntimeError::WrongArity {
2033 expected: 2,
2034 got: args.len(),
2035 });
2036 }
2037
2038 match (&args[0], &args[1]) {
2039 (Value::Array(a), Value::Array(b)) => {
2040 // Extract dimensions
2041 let rows_a = a.len();
2042 if rows_a == 0 {
2043 return Err(RuntimeError::InvalidOperation(
2044 "Matrix A is empty".to_string(),
2045 ));
2046 }
2047
2048 let cols_a = match &a[0] {
2049 Value::Array(row) => row.len(),
2050 _ => {
2051 return Err(RuntimeError::TypeErrorDetailed {
2052 expected: "2D Array (Array of Arrays)".to_string(),
2053 got: format!("Array containing {:?}", a[0]),
2054 })
2055 }
2056 };
2057
2058 let rows_b = b.len();
2059 if rows_b == 0 {
2060 return Err(RuntimeError::InvalidOperation(
2061 "Matrix B is empty".to_string(),
2062 ));
2063 }
2064
2065 let cols_b = match &b[0] {
2066 Value::Array(row) => row.len(),
2067 _ => {
2068 return Err(RuntimeError::TypeErrorDetailed {
2069 expected: "2D Array (Array of Arrays)".to_string(),
2070 got: format!("Array containing {:?}", b[0]),
2071 })
2072 }
2073 };
2074
2075 if cols_a != rows_b {
2076 return Err(RuntimeError::InvalidOperation(format!(
2077 "Matrix dimensions incompatible: ({}, {}) × ({}, {})",
2078 rows_a, cols_a, rows_b, cols_b
2079 )));
2080 }
2081
2082 // Perform multiplication
2083 let mut result = Vec::new();
2084 for i in 0..rows_a {
2085 let row_a = match &a[i] {
2086 Value::Array(r) => r,
2087 _ => {
2088 return Err(RuntimeError::TypeErrorDetailed {
2089 expected: "2D Array".to_string(),
2090 got: format!("Non-uniform array structure"),
2091 })
2092 }
2093 };
2094
2095 let mut result_row = Vec::new();
2096 for j in 0..cols_b {
2097 let mut sum = 0.0;
2098 for k in 0..cols_a {
2099 let a_val = match &row_a[k] {
2100 Value::Number(n) => *n,
2101 _ => {
2102 return Err(RuntimeError::TypeErrorDetailed {
2103 expected: "Number".to_string(),
2104 got: format!("{:?}", row_a[k]),
2105 })
2106 }
2107 };
2108
2109 let row_b = match &b[k] {
2110 Value::Array(r) => r,
2111 _ => {
2112 return Err(RuntimeError::TypeErrorDetailed {
2113 expected: "2D Array".to_string(),
2114 got: format!("Non-uniform array structure"),
2115 })
2116 }
2117 };
2118
2119 let b_val = match &row_b[j] {
2120 Value::Number(n) => *n,
2121 _ => {
2122 return Err(RuntimeError::TypeErrorDetailed {
2123 expected: "Number".to_string(),
2124 got: format!("{:?}", row_b[j]),
2125 })
2126 }
2127 };
2128
2129 sum += a_val * b_val;
2130 }
2131 result_row.push(Value::Number(sum));
2132 }
2133 result.push(Value::Array(result_row));
2134 }
2135
2136 Ok(Value::Array(result))
2137 }
2138 _ => Err(RuntimeError::TypeErrorDetailed {
2139 expected: "Array, Array".to_string(),
2140 got: format!("{:?}, {:?}", args[0], args[1]),
2141 }),
2142 }
2143}
2144
2145/// 矩阵转置
2146///
2147/// # 功能
2148/// 计算矩阵的转置(行列互换)。
2149///
2150/// # 参数
2151/// - `matrix`: Array - 输入矩阵(二维数组)[m × n]
2152///
2153/// # 返回值
2154/// Array - 转置后的矩阵 [n × m]
2155///
2156/// # 公式
2157/// ```
2158/// B[j][i] = A[i][j]
2159/// ```
2160///
2161/// # 示例
2162/// ```aether
2163/// Set A [[1, 2, 3], [4, 5, 6]]
2164/// Set B Transpose(A) # [[1, 4], [2, 5], [3, 6]]
2165/// Set M [[1, 2], [3, 4]]
2166/// Set MT Transpose(M) # [[1, 3], [2, 4]]
2167/// ```
2168pub fn transpose(args: &[Value]) -> Result<Value, RuntimeError> {
2169 if args.len() != 1 {
2170 return Err(RuntimeError::WrongArity {
2171 expected: 1,
2172 got: args.len(),
2173 });
2174 }
2175
2176 match &args[0] {
2177 Value::Array(matrix) => {
2178 if matrix.is_empty() {
2179 return Ok(Value::Array(vec![]));
2180 }
2181
2182 let rows = matrix.len();
2183 let cols = match &matrix[0] {
2184 Value::Array(row) => row.len(),
2185 _ => {
2186 return Err(RuntimeError::TypeErrorDetailed {
2187 expected: "2D Array".to_string(),
2188 got: format!("Array containing {:?}", matrix[0]),
2189 })
2190 }
2191 };
2192
2193 if cols == 0 {
2194 return Ok(Value::Array(vec![]));
2195 }
2196
2197 let mut result = vec![vec![Value::Null; rows]; cols];
2198
2199 for i in 0..rows {
2200 let row = match &matrix[i] {
2201 Value::Array(r) => r,
2202 _ => {
2203 return Err(RuntimeError::TypeErrorDetailed {
2204 expected: "2D Array".to_string(),
2205 got: format!("Non-uniform array structure"),
2206 })
2207 }
2208 };
2209
2210 if row.len() != cols {
2211 return Err(RuntimeError::InvalidOperation(
2212 "All rows must have same length".to_string(),
2213 ));
2214 }
2215
2216 for j in 0..cols {
2217 result[j][i] = row[j].clone();
2218 }
2219 }
2220
2221 let result_arrays: Vec<Value> = result.into_iter().map(Value::Array).collect();
2222
2223 Ok(Value::Array(result_arrays))
2224 }
2225 _ => Err(RuntimeError::TypeErrorDetailed {
2226 expected: "Array".to_string(),
2227 got: format!("{:?}", args[0]),
2228 }),
2229 }
2230}
2231
2232/// 计算行列式
2233///
2234/// # 功能
2235/// 计算方阵的行列式(支持 1×1、2×2、3×3 矩阵)。
2236///
2237/// # 参数
2238/// - `matrix`: Array - 方阵(二维数组)
2239///
2240/// # 返回值
2241/// Number - 行列式的值
2242///
2243/// # 公式
2244/// - 2×2: det = ad - bc
2245/// - 3×3: Sarrus规则
2246///
2247/// # 错误
2248/// - 非方阵或维度 > 3 时抛出错误
2249///
2250/// # 示例
2251/// ```aether
2252/// Set A [[1, 2], [3, 4]]
2253/// Set det Determinant(A) # -2.0 (1*4 - 2*3)
2254/// Set I [[1, 0], [0, 1]]
2255/// Set det Determinant(I) # 1.0 (单位矩阵)
2256/// Set B [[1, 2, 3], [0, 1, 4], [5, 6, 0]]
2257/// Set det Determinant(B) # 1.0
2258/// ```
2259pub fn determinant(args: &[Value]) -> Result<Value, RuntimeError> {
2260 if args.len() != 1 {
2261 return Err(RuntimeError::WrongArity {
2262 expected: 1,
2263 got: args.len(),
2264 });
2265 }
2266
2267 match &args[0] {
2268 Value::Array(matrix) => {
2269 let n = matrix.len();
2270
2271 if n == 0 {
2272 return Err(RuntimeError::InvalidOperation(
2273 "Matrix is empty".to_string(),
2274 ));
2275 }
2276
2277 // Verify square matrix
2278 for row in matrix {
2279 match row {
2280 Value::Array(r) => {
2281 if r.len() != n {
2282 return Err(RuntimeError::InvalidOperation(
2283 "Determinant requires square matrix".to_string(),
2284 ));
2285 }
2286 }
2287 _ => {
2288 return Err(RuntimeError::TypeErrorDetailed {
2289 expected: "2D Array".to_string(),
2290 got: format!("Array containing {:?}", row),
2291 })
2292 }
2293 }
2294 }
2295
2296 // Calculate determinant based on size
2297 match n {
2298 1 => {
2299 // 1x1 matrix
2300 match &matrix[0] {
2301 Value::Array(row) => match &row[0] {
2302 Value::Number(n) => Ok(Value::Number(*n)),
2303 _ => Err(RuntimeError::TypeErrorDetailed {
2304 expected: "Number".to_string(),
2305 got: format!("{:?}", row[0]),
2306 }),
2307 },
2308 _ => unreachable!(),
2309 }
2310 }
2311 2 => {
2312 // 2x2 matrix: ad - bc
2313 let a = get_matrix_element(matrix, 0, 0)?;
2314 let b = get_matrix_element(matrix, 0, 1)?;
2315 let c = get_matrix_element(matrix, 1, 0)?;
2316 let d = get_matrix_element(matrix, 1, 1)?;
2317
2318 Ok(Value::Number(a * d - b * c))
2319 }
2320 3 => {
2321 // 3x3 matrix: Sarrus' rule
2322 let a = get_matrix_element(matrix, 0, 0)?;
2323 let b = get_matrix_element(matrix, 0, 1)?;
2324 let c = get_matrix_element(matrix, 0, 2)?;
2325 let d = get_matrix_element(matrix, 1, 0)?;
2326 let e = get_matrix_element(matrix, 1, 1)?;
2327 let f = get_matrix_element(matrix, 1, 2)?;
2328 let g = get_matrix_element(matrix, 2, 0)?;
2329 let h = get_matrix_element(matrix, 2, 1)?;
2330 let i = get_matrix_element(matrix, 2, 2)?;
2331
2332 let det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
2333 Ok(Value::Number(det))
2334 }
2335 _ => {
2336 // For larger matrices, use recursive cofactor expansion
2337 determinant_recursive(matrix)
2338 }
2339 }
2340 }
2341 _ => Err(RuntimeError::TypeErrorDetailed {
2342 expected: "Array".to_string(),
2343 got: format!("{:?}", args[0]),
2344 }),
2345 }
2346}
2347
2348/// 递归计算任意大小方阵的行列式(余子式展开法)
2349fn determinant_recursive(matrix: &[Value]) -> Result<Value, RuntimeError> {
2350 let n = matrix.len();
2351
2352 if n == 1 {
2353 return match &matrix[0] {
2354 Value::Array(row) => match &row[0] {
2355 Value::Number(val) => Ok(Value::Number(*val)),
2356 _ => Err(RuntimeError::TypeErrorDetailed {
2357 expected: "Number".to_string(),
2358 got: format!("Non-numeric value in matrix"),
2359 }),
2360 },
2361 _ => Err(RuntimeError::TypeErrorDetailed {
2362 expected: "Array".to_string(),
2363 got: format!("Invalid matrix structure"),
2364 }),
2365 };
2366 }
2367
2368 let mut det = 0.0;
2369
2370 // Expand along first row
2371 for j in 0..n {
2372 let element = get_matrix_element(matrix, 0, j)?;
2373
2374 // Create minor matrix (remove row 0 and column j)
2375 let mut minor = Vec::new();
2376 for i in 1..n {
2377 let mut row = Vec::new();
2378 match &matrix[i] {
2379 Value::Array(matrix_row) => {
2380 for k in 0..n {
2381 if k != j {
2382 row.push(matrix_row[k].clone());
2383 }
2384 }
2385 }
2386 _ => {
2387 return Err(RuntimeError::TypeErrorDetailed {
2388 expected: "Array".to_string(),
2389 got: format!("Invalid matrix row"),
2390 })
2391 }
2392 }
2393 minor.push(Value::Array(row));
2394 }
2395
2396 // Recursive call
2397 let minor_det = determinant_recursive(&minor)?;
2398 let minor_val = match minor_det {
2399 Value::Number(v) => v,
2400 _ => unreachable!(),
2401 };
2402
2403 // Add to determinant with alternating signs
2404 let sign = if j % 2 == 0 { 1.0 } else { -1.0 };
2405 det += sign * element * minor_val;
2406 }
2407
2408 Ok(Value::Number(det))
2409}
2410
2411/// 矩阵求逆
2412///
2413/// # 功能
2414/// 计算方阵的逆矩阵(使用高斯-约旦消元法)。
2415///
2416/// # 参数
2417/// - `matrix`: Array - 可逆方阵(二维数组)
2418///
2419/// # 返回值
2420/// Array - 逆矩阵
2421///
2422/// # 公式
2423/// ```
2424/// A * A⁻¹ = I (单位矩阵)
2425/// ```
2426///
2427/// # 错误
2428/// - 非方阵或奇异矩阵(行列式为0)时抛出错误
2429///
2430/// # 示例
2431/// ```aether
2432/// Set A [[4, 7], [2, 6]]
2433/// Set invA Inverse(A) # [[0.6, -0.7], [-0.2, 0.4]]
2434/// Set I Matmul(A, invA) # [[1, 0], [0, 1]]
2435/// Set A [[1, 2, 3], [0, 1, 4], [5, 6, 0]]
2436/// Set invA Inverse(A)
2437/// ```
2438pub fn matrix_inverse(args: &[Value]) -> Result<Value, RuntimeError> {
2439 if args.len() != 1 {
2440 return Err(RuntimeError::WrongArity {
2441 expected: 1,
2442 got: args.len(),
2443 });
2444 }
2445
2446 match &args[0] {
2447 Value::Array(matrix) => {
2448 let n = matrix.len();
2449
2450 if n == 0 {
2451 return Err(RuntimeError::InvalidOperation(
2452 "Matrix is empty".to_string(),
2453 ));
2454 }
2455
2456 // Verify square matrix and extract values
2457 let mut mat: Vec<Vec<f64>> = Vec::new();
2458 for row_val in matrix {
2459 match row_val {
2460 Value::Array(row) => {
2461 if row.len() != n {
2462 return Err(RuntimeError::InvalidOperation(
2463 "Matrix must be square".to_string(),
2464 ));
2465 }
2466 let mut num_row = Vec::new();
2467 for val in row {
2468 match val {
2469 Value::Number(num) => num_row.push(*num),
2470 _ => {
2471 return Err(RuntimeError::TypeErrorDetailed {
2472 expected: "Number".to_string(),
2473 got: format!("{:?}", val),
2474 })
2475 }
2476 }
2477 }
2478 mat.push(num_row);
2479 }
2480 _ => {
2481 return Err(RuntimeError::TypeErrorDetailed {
2482 expected: "Array".to_string(),
2483 got: format!("{:?}", row_val),
2484 })
2485 }
2486 }
2487 }
2488
2489 // Create augmented matrix [A | I]
2490 let mut aug = vec![vec![0.0; 2 * n]; n];
2491 for i in 0..n {
2492 for j in 0..n {
2493 aug[i][j] = mat[i][j];
2494 aug[i][n + j] = if i == j { 1.0 } else { 0.0 };
2495 }
2496 }
2497
2498 // Gaussian-Jordan elimination
2499 for i in 0..n {
2500 // Find pivot
2501 let mut max_row = i;
2502 for k in (i + 1)..n {
2503 if aug[k][i].abs() > aug[max_row][i].abs() {
2504 max_row = k;
2505 }
2506 }
2507
2508 // Swap rows
2509 aug.swap(i, max_row);
2510
2511 // Check for singular matrix
2512 if aug[i][i].abs() < 1e-10 {
2513 return Err(RuntimeError::InvalidOperation(
2514 "Matrix is singular (not invertible)".to_string(),
2515 ));
2516 }
2517
2518 // Scale pivot row
2519 let pivot = aug[i][i];
2520 for j in 0..(2 * n) {
2521 aug[i][j] /= pivot;
2522 }
2523
2524 // Eliminate column
2525 for k in 0..n {
2526 if k != i {
2527 let factor = aug[k][i];
2528 for j in 0..(2 * n) {
2529 aug[k][j] -= factor * aug[i][j];
2530 }
2531 }
2532 }
2533 }
2534
2535 // Extract inverse matrix from augmented matrix
2536 let mut result = Vec::new();
2537 for i in 0..n {
2538 let mut row = Vec::new();
2539 for j in n..(2 * n) {
2540 row.push(Value::Number(aug[i][j]));
2541 }
2542 result.push(Value::Array(row));
2543 }
2544
2545 Ok(Value::Array(result))
2546 }
2547 _ => Err(RuntimeError::TypeErrorDetailed {
2548 expected: "Array".to_string(),
2549 got: format!("{:?}", args[0]),
2550 }),
2551 }
2552}
2553
2554// Helper function for matrix element access
2555fn get_matrix_element(matrix: &[Value], i: usize, j: usize) -> Result<f64, RuntimeError> {
2556 match &matrix[i] {
2557 Value::Array(row) => match &row[j] {
2558 Value::Number(n) => Ok(*n),
2559 _ => Err(RuntimeError::TypeErrorDetailed {
2560 expected: "Number".to_string(),
2561 got: format!("{:?}", row[j]),
2562 }),
2563 },
2564 _ => Err(RuntimeError::TypeErrorDetailed {
2565 expected: "Array".to_string(),
2566 got: format!("{:?}", matrix[i]),
2567 }),
2568 }
2569}
2570
2571// ============================================================================
2572// Mathematical Constants
2573// ============================================================================
2574
2575/// 圆周率 π
2576///
2577/// # 功能
2578/// 返回数学常数 π(圆周率)。
2579///
2580/// # 返回值
2581/// Number - π ≈ 3.141592653589793
2582///
2583/// # 说明
2584/// π 是圆的周长与直径的比值。
2585///
2586/// # 示例
2587/// ```aether
2588/// Set pi PI() # 3.141592653589793
2589/// Set circumference PI() * 2 * radius
2590/// Set angle PI() / 4 # 45度 (弧度制)
2591/// ```
2592pub fn pi(_args: &[Value]) -> Result<Value, RuntimeError> {
2593 Ok(Value::Number(consts::PI))
2594}
2595
2596/// 自然常数 e
2597///
2598/// # 功能
2599/// 返回数学常数 e(自然常数、欧拉数)。
2600///
2601/// # 返回值
2602/// Number - e ≈ 2.718281828459045
2603///
2604/// # 说明
2605/// e 是自然对数的底数。
2606///
2607/// # 示例
2608/// ```aether
2609/// Set e E() # 2.718281828459045
2610/// Set y Exp(1) # 也等于 e
2611/// Set growth E() * rate # 指数增长
2612/// ```
2613pub fn e(_args: &[Value]) -> Result<Value, RuntimeError> {
2614 Ok(Value::Number(consts::E))
2615}
2616
2617/// 圆周率 τ (TAU)
2618///
2619/// # 功能
2620/// 返回数学常数 τ = 2π。
2621///
2622/// # 返回值
2623/// Number - τ ≈ 6.283185307179586
2624///
2625/// # 说明
2626/// τ 是圆的周长与半径的比值,等于 2π。
2627///
2628/// # 示例
2629/// ```aether
2630/// Set tau TAU() # 6.283185307179586
2631/// Set fullCircle TAU() # 完整圆周 (360度)
2632/// Set angle TAU() / 8 # 1/8圆周 (45度)
2633/// ```
2634pub fn tau(_args: &[Value]) -> Result<Value, RuntimeError> {
2635 Ok(Value::Number(consts::TAU))
2636}
2637
2638/// 黄金比例 φ (PHI)
2639///
2640/// # 功能
2641/// 返回数学常数 φ(黄金比例)。
2642///
2643/// # 返回值
2644/// Number - φ ≈ 1.618033988749895
2645///
2646/// # 公式
2647/// ```
2648/// φ = (1 + √5) / 2
2649/// ```
2650///
2651/// # 说明
2652/// 黄金比例在几何、艺术和自然界中广泛出现。
2653///
2654/// # 示例
2655/// ```aether
2656/// Set phi PHI() # 1.618033988749895
2657/// Set ratio PHI() # 黄金分割比例
2658/// Set fibonacci PHI() * PHI() # φ² ≈ 2.618
2659/// ```
2660pub fn phi(_args: &[Value]) -> Result<Value, RuntimeError> {
2661 Ok(Value::Number((1.0 + 5.0_f64.sqrt()) / 2.0))
2662}
2663
2664// ============================================================================
2665// Advanced Statistics - Linear Regression
2666// ============================================================================
2667
2668/// 简单线性回归
2669///
2670/// # 功能
2671/// 对数据进行简单线性回归分析,返回斜率和截距。
2672///
2673/// # 参数
2674/// - `x`: Array - 自变量数组
2675/// - `y`: Array - 因变量数组
2676///
2677/// # 返回值
2678/// Array - [slope, intercept, r_squared]
2679/// - slope: 斜率
2680/// - intercept: 截距
2681/// - r_squared: 决定系数 R²
2682///
2683/// # 公式
2684/// ```
2685/// y = slope * x + intercept
2686/// slope = Σ[(xi - x̄)(yi - ȳ)] / Σ(xi - x̄)²
2687/// intercept = ȳ - slope * x̄
2688/// R² = 1 - SS_res / SS_tot
2689/// ```
2690///
2691/// # 错误
2692/// - 两个数组长度必须相同
2693/// - 至少需要 2 个数据点
2694///
2695/// # 示例
2696/// ```aether
2697/// Set x [1, 2, 3, 4, 5]
2698/// Set y [2, 4, 5, 4, 5]
2699/// Set result LinearRegression(x, y)
2700/// Set slope result[0] # 0.6
2701/// Set intercept result[1] # 2.2
2702/// Set r2 result[2] # 0.4286
2703/// ```
2704pub fn linear_regression(args: &[Value]) -> Result<Value, RuntimeError> {
2705 if args.len() != 2 {
2706 return Err(RuntimeError::WrongArity {
2707 expected: 2,
2708 got: args.len(),
2709 });
2710 }
2711
2712 match (&args[0], &args[1]) {
2713 (Value::Array(x_arr), Value::Array(y_arr)) => {
2714 if x_arr.len() != y_arr.len() {
2715 return Err(RuntimeError::InvalidOperation(format!(
2716 "X and Y arrays must have same length: {} vs {}",
2717 x_arr.len(),
2718 y_arr.len()
2719 )));
2720 }
2721
2722 if x_arr.len() < 2 {
2723 return Err(RuntimeError::InvalidOperation(
2724 "Linear regression requires at least 2 data points".to_string(),
2725 ));
2726 }
2727
2728 // Extract numbers
2729 let mut x_vals = Vec::new();
2730 let mut y_vals = Vec::new();
2731
2732 for val in x_arr {
2733 match val {
2734 Value::Number(n) => x_vals.push(*n),
2735 _ => {
2736 return Err(RuntimeError::TypeErrorDetailed {
2737 expected: "Array of Numbers".to_string(),
2738 got: format!("Array containing {:?}", val),
2739 })
2740 }
2741 }
2742 }
2743
2744 for val in y_arr {
2745 match val {
2746 Value::Number(n) => y_vals.push(*n),
2747 _ => {
2748 return Err(RuntimeError::TypeErrorDetailed {
2749 expected: "Array of Numbers".to_string(),
2750 got: format!("Array containing {:?}", val),
2751 })
2752 }
2753 }
2754 }
2755
2756 let n = x_vals.len() as f64;
2757
2758 // Calculate means
2759 let x_mean = x_vals.iter().sum::<f64>() / n;
2760 let y_mean = y_vals.iter().sum::<f64>() / n;
2761
2762 // Calculate slope
2763 let mut numerator = 0.0;
2764 let mut denominator = 0.0;
2765
2766 for i in 0..x_vals.len() {
2767 let x_diff = x_vals[i] - x_mean;
2768 let y_diff = y_vals[i] - y_mean;
2769 numerator += x_diff * y_diff;
2770 denominator += x_diff * x_diff;
2771 }
2772
2773 if denominator == 0.0 {
2774 return Err(RuntimeError::InvalidOperation(
2775 "Cannot compute regression: X values have no variance".to_string(),
2776 ));
2777 }
2778
2779 let slope = numerator / denominator;
2780 let intercept = y_mean - slope * x_mean;
2781
2782 // Calculate R²
2783 let mut ss_res = 0.0; // Residual sum of squares
2784 let mut ss_tot = 0.0; // Total sum of squares
2785
2786 for i in 0..x_vals.len() {
2787 let y_pred = slope * x_vals[i] + intercept;
2788 let residual = y_vals[i] - y_pred;
2789 ss_res += residual * residual;
2790
2791 let total_diff = y_vals[i] - y_mean;
2792 ss_tot += total_diff * total_diff;
2793 }
2794
2795 let r_squared = if ss_tot == 0.0 {
2796 1.0 // Perfect fit if no variance
2797 } else {
2798 1.0 - (ss_res / ss_tot)
2799 };
2800
2801 Ok(Value::Array(vec![
2802 Value::Number(slope),
2803 Value::Number(intercept),
2804 Value::Number(r_squared),
2805 ]))
2806 }
2807 _ => Err(RuntimeError::TypeErrorDetailed {
2808 expected: "Array, Array".to_string(),
2809 got: format!("{:?}, {:?}", args[0], args[1]),
2810 }),
2811 }
2812}
2813
2814// ============================================================================
2815// Probability Distributions
2816// ============================================================================
2817
2818/// 正态分布的概率密度函数 (PDF)
2819///
2820/// # 功能
2821/// 计算正态分布在指定点的概率密度。
2822///
2823/// # 参数
2824/// - `x`: Number - 计算点
2825/// - `mean`: Number - 均值 μ(可选,默认0)
2826/// - `std`: Number - 标准差 σ(可选,默认1)
2827///
2828/// # 返回值
2829/// Number - 概率密度值
2830///
2831/// # 公式
2832/// ```
2833/// PDF(x) = (1 / (σ√(2π))) * e^(-(x-μ)²/(2σ²))
2834/// ```
2835///
2836/// # 示例
2837/// ```aether
2838/// Set p NormalPDF(0, 0, 1) # 标准正态分布在0点: 0.3989
2839/// Set p NormalPDF(1.96, 0, 1) # 在1.96点: 0.0584
2840/// Set p NormalPDF(10, 10, 2) # μ=10, σ=2: 0.1995
2841/// ```
2842pub fn normal_pdf(args: &[Value]) -> Result<Value, RuntimeError> {
2843 let (x, mean, std) = match args.len() {
2844 1 => match &args[0] {
2845 Value::Number(x) => (*x, 0.0, 1.0),
2846 _ => {
2847 return Err(RuntimeError::TypeErrorDetailed {
2848 expected: "Number".to_string(),
2849 got: format!("{:?}", args[0]),
2850 })
2851 }
2852 },
2853 3 => match (&args[0], &args[1], &args[2]) {
2854 (Value::Number(x), Value::Number(m), Value::Number(s)) => {
2855 if *s <= 0.0 {
2856 return Err(RuntimeError::InvalidOperation(format!(
2857 "Standard deviation must be positive, got {}",
2858 s
2859 )));
2860 }
2861 (*x, *m, *s)
2862 }
2863 _ => {
2864 return Err(RuntimeError::TypeErrorDetailed {
2865 expected: "Number, Number, Number".to_string(),
2866 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
2867 })
2868 }
2869 },
2870 n => {
2871 return Err(RuntimeError::WrongArity {
2872 expected: 1,
2873 got: n,
2874 })
2875 }
2876 };
2877
2878 let z = (x - mean) / std;
2879 let coefficient = 1.0 / (std * (2.0 * consts::PI).sqrt());
2880 let exponent = -0.5 * z * z;
2881 let pdf = coefficient * exponent.exp();
2882
2883 Ok(Value::Number(pdf))
2884}
2885
2886/// 正态分布的累积分布函数 (CDF)
2887///
2888/// # 功能
2889/// 计算正态分布的累积概率 P(X ≤ x)。
2890///
2891/// # 参数
2892/// - `x`: Number - 计算点
2893/// - `mean`: Number - 均值 μ(可选,默认0)
2894/// - `std`: Number - 标准差 σ(可选,默认1)
2895///
2896/// # 返回值
2897/// Number - 累积概率,范围 [0, 1]
2898///
2899/// # 公式
2900/// ```
2901/// CDF(x) = 0.5 * [1 + erf((x-μ)/(σ√2))]
2902/// ```
2903///
2904/// # 示例
2905/// ```aether
2906/// Set p NormalCDF(0, 0, 1) # 50% (中位数)
2907/// Set p NormalCDF(1.96, 0, 1) # 97.5% (95%置信区间上界)
2908/// Set p NormalCDF(-1.96, 0, 1)# 2.5% (95%置信区间下界)
2909/// ```
2910pub fn normal_cdf(args: &[Value]) -> Result<Value, RuntimeError> {
2911 let (x, mean, std) = match args.len() {
2912 1 => match &args[0] {
2913 Value::Number(x) => (*x, 0.0, 1.0),
2914 _ => {
2915 return Err(RuntimeError::TypeErrorDetailed {
2916 expected: "Number".to_string(),
2917 got: format!("{:?}", args[0]),
2918 })
2919 }
2920 },
2921 3 => match (&args[0], &args[1], &args[2]) {
2922 (Value::Number(x), Value::Number(m), Value::Number(s)) => {
2923 if *s <= 0.0 {
2924 return Err(RuntimeError::InvalidOperation(format!(
2925 "Standard deviation must be positive, got {}",
2926 s
2927 )));
2928 }
2929 (*x, *m, *s)
2930 }
2931 _ => {
2932 return Err(RuntimeError::TypeErrorDetailed {
2933 expected: "Number, Number, Number".to_string(),
2934 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
2935 })
2936 }
2937 },
2938 n => {
2939 return Err(RuntimeError::WrongArity {
2940 expected: 1,
2941 got: n,
2942 })
2943 }
2944 };
2945
2946 let z = (x - mean) / (std * 2.0_f64.sqrt());
2947 let erf_result = erf(&[Value::Number(z)])?;
2948
2949 match erf_result {
2950 Value::Number(erf_val) => {
2951 let cdf = 0.5 * (1.0 + erf_val);
2952 Ok(Value::Number(cdf))
2953 }
2954 _ => unreachable!(),
2955 }
2956}
2957
2958/// 泊松分布的概率质量函数 (PMF)
2959///
2960/// # 功能
2961/// 计算泊松分布在指定点的概率。
2962///
2963/// # 参数
2964/// - `k`: Number - 事件发生次数(非负整数)
2965/// - `lambda`: Number - 平均发生率 λ(必须 > 0)
2966///
2967/// # 返回值
2968/// Number - 概率值
2969///
2970/// # 公式
2971/// ```
2972/// P(X = k) = (λ^k * e^(-λ)) / k!
2973/// ```
2974///
2975/// # 应用
2976/// - 单位时间内事件发生的次数
2977/// - 稀有事件的概率模型
2978///
2979/// # 示例
2980/// ```aether
2981/// Set p PoissonPMF(3, 2.5) # λ=2.5时,恰好3次的概率
2982/// Set p PoissonPMF(0, 1) # 平均1次,0次发生的概率: e^(-1)
2983/// Set p PoissonPMF(5, 5) # λ=k=5: 0.1755
2984/// ```
2985pub fn poisson_pmf(args: &[Value]) -> Result<Value, RuntimeError> {
2986 if args.len() != 2 {
2987 return Err(RuntimeError::WrongArity {
2988 expected: 2,
2989 got: args.len(),
2990 });
2991 }
2992
2993 match (&args[0], &args[1]) {
2994 (Value::Number(k), Value::Number(lambda)) => {
2995 if *k < 0.0 || k.fract() != 0.0 {
2996 return Err(RuntimeError::InvalidOperation(format!(
2997 "k must be a non-negative integer, got {}",
2998 k
2999 )));
3000 }
3001
3002 if *lambda <= 0.0 {
3003 return Err(RuntimeError::InvalidOperation(format!(
3004 "Lambda must be positive, got {}",
3005 lambda
3006 )));
3007 }
3008
3009 // Calculate k! using factorial function
3010 let fact_result = factorial(&[Value::Number(*k)])?;
3011 let k_factorial = match fact_result {
3012 Value::Number(f) => f,
3013 _ => unreachable!(),
3014 };
3015
3016 // P(X = k) = (λ^k * e^(-λ)) / k!
3017 let numerator = lambda.powf(*k) * (-lambda).exp();
3018 let pmf = numerator / k_factorial;
3019
3020 Ok(Value::Number(pmf))
3021 }
3022 _ => Err(RuntimeError::TypeErrorDetailed {
3023 expected: "Number, Number".to_string(),
3024 got: format!("{:?}, {:?}", args[0], args[1]),
3025 }),
3026 }
3027}
3028
3029// ============================================================================
3030// 带精度计算函数
3031// ============================================================================
3032
3033/// 四舍五入到指定小数位数
3034///
3035/// # 功能
3036/// 将数字四舍五入到指定的小数位数。
3037///
3038/// # 参数
3039/// - `x`: Number - 输入数字
3040/// - `digits`: Number - 小数位数(非负整数)
3041///
3042/// # 返回值
3043/// Number - 四舍五入后的数字
3044///
3045/// # 示例
3046/// ```aether
3047/// Set a RoundTo(3.14159, 2) # 3.14
3048/// Set b RoundTo(123.456, 1) # 123.5
3049/// Set c RoundTo(0.666666, 4) # 0.6667
3050/// ```
3051pub fn round_to(args: &[Value]) -> Result<Value, RuntimeError> {
3052 if args.len() != 2 {
3053 return Err(RuntimeError::WrongArity {
3054 expected: 2,
3055 got: args.len(),
3056 });
3057 }
3058
3059 match (&args[0], &args[1]) {
3060 (Value::Number(x), Value::Number(digits)) => {
3061 if *digits < 0.0 || digits.fract() != 0.0 {
3062 return Err(RuntimeError::InvalidOperation(format!(
3063 "Digits must be a non-negative integer, got {}",
3064 digits
3065 )));
3066 }
3067
3068 let multiplier = 10_f64.powi(*digits as i32);
3069 let result = (x * multiplier).round() / multiplier;
3070 Ok(Value::Number(result))
3071 }
3072 _ => Err(RuntimeError::TypeErrorDetailed {
3073 expected: "Number, Number".to_string(),
3074 got: format!("{:?}, {:?}", args[0], args[1]),
3075 }),
3076 }
3077}
3078
3079/// 带精度加法
3080///
3081/// # 功能
3082/// 先将两个数字按指定精度四舍五入,然后进行加法运算。
3083///
3084/// # 参数
3085/// - `a`: Number - 第一个加数
3086/// - `b`: Number - 第二个加数
3087/// - `precision`: Number - 精度(小数位数)
3088///
3089/// # 返回值
3090/// Number - 结果(按精度四舍五入)
3091///
3092/// # 示例
3093/// ```aether
3094/// Set result AddWithPrecision(0.1, 0.2, 2) # 0.30
3095/// Set result AddWithPrecision(1.235, 2.346, 2) # 3.58
3096/// ```
3097pub fn add_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3098 if args.len() != 3 {
3099 return Err(RuntimeError::WrongArity {
3100 expected: 3,
3101 got: args.len(),
3102 });
3103 }
3104
3105 match (&args[0], &args[1], &args[2]) {
3106 (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3107 if *precision < 0.0 || precision.fract() != 0.0 {
3108 return Err(RuntimeError::InvalidOperation(format!(
3109 "Precision must be a non-negative integer, got {}",
3110 precision
3111 )));
3112 }
3113
3114 let multiplier = 10_f64.powi(*precision as i32);
3115 let a_rounded = (a * multiplier).round() / multiplier;
3116 let b_rounded = (b * multiplier).round() / multiplier;
3117 let result = ((a_rounded + b_rounded) * multiplier).round() / multiplier;
3118
3119 Ok(Value::Number(result))
3120 }
3121 _ => Err(RuntimeError::TypeErrorDetailed {
3122 expected: "Number, Number, Number".to_string(),
3123 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3124 }),
3125 }
3126}
3127
3128/// 带精度减法
3129///
3130/// # 功能
3131/// 先将两个数字按指定精度四舍五入,然后进行减法运算。
3132///
3133/// # 参数
3134/// - `a`: Number - 被减数
3135/// - `b`: Number - 减数
3136/// - `precision`: Number - 精度(小数位数)
3137///
3138/// # 返回值
3139/// Number - 结果(按精度四舍五入)
3140///
3141/// # 示例
3142/// ```aether
3143/// Set result SubWithPrecision(1.5, 0.3, 1) # 1.2
3144/// Set result SubWithPrecision(5.678, 2.345, 2) # 3.33
3145/// ```
3146pub fn sub_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3147 if args.len() != 3 {
3148 return Err(RuntimeError::WrongArity {
3149 expected: 3,
3150 got: args.len(),
3151 });
3152 }
3153
3154 match (&args[0], &args[1], &args[2]) {
3155 (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3156 if *precision < 0.0 || precision.fract() != 0.0 {
3157 return Err(RuntimeError::InvalidOperation(format!(
3158 "Precision must be a non-negative integer, got {}",
3159 precision
3160 )));
3161 }
3162
3163 let multiplier = 10_f64.powi(*precision as i32);
3164 let a_rounded = (a * multiplier).round() / multiplier;
3165 let b_rounded = (b * multiplier).round() / multiplier;
3166 let result = ((a_rounded - b_rounded) * multiplier).round() / multiplier;
3167
3168 Ok(Value::Number(result))
3169 }
3170 _ => Err(RuntimeError::TypeErrorDetailed {
3171 expected: "Number, Number, Number".to_string(),
3172 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3173 }),
3174 }
3175}
3176
3177/// 带精度乘法
3178///
3179/// # 功能
3180/// 先将两个数字按指定精度四舍五入,然后进行乘法运算。
3181///
3182/// # 参数
3183/// - `a`: Number - 第一个乘数
3184/// - `b`: Number - 第二个乘数
3185/// - `precision`: Number - 精度(小数位数)
3186///
3187/// # 返回值
3188/// Number - 结果(按精度四舍五入)
3189///
3190/// # 示例
3191/// ```aether
3192/// Set result MulWithPrecision(0.1, 0.2, 3) # 0.02
3193/// Set result MulWithPrecision(3.456, 2.5, 2) # 8.64
3194/// ```
3195pub fn mul_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3196 if args.len() != 3 {
3197 return Err(RuntimeError::WrongArity {
3198 expected: 3,
3199 got: args.len(),
3200 });
3201 }
3202
3203 match (&args[0], &args[1], &args[2]) {
3204 (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3205 if *precision < 0.0 || precision.fract() != 0.0 {
3206 return Err(RuntimeError::InvalidOperation(format!(
3207 "Precision must be a non-negative integer, got {}",
3208 precision
3209 )));
3210 }
3211
3212 let multiplier = 10_f64.powi(*precision as i32);
3213 let a_rounded = (a * multiplier).round() / multiplier;
3214 let b_rounded = (b * multiplier).round() / multiplier;
3215 let result = ((a_rounded * b_rounded) * multiplier).round() / multiplier;
3216
3217 Ok(Value::Number(result))
3218 }
3219 _ => Err(RuntimeError::TypeErrorDetailed {
3220 expected: "Number, Number, Number".to_string(),
3221 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3222 }),
3223 }
3224}
3225
3226/// 带精度除法
3227///
3228/// # 功能
3229/// 先将两个数字按指定精度四舍五入,然后进行除法运算。
3230///
3231/// # 参数
3232/// - `a`: Number - 被除数
3233/// - `b`: Number - 除数(不能为0)
3234/// - `precision`: Number - 精度(小数位数)
3235///
3236/// # 返回值
3237/// Number - 结果(按精度四舍五入)
3238///
3239/// # 示例
3240/// ```aether
3241/// Set result DivWithPrecision(1.0, 3.0, 2) # 0.33
3242/// Set result DivWithPrecision(10.0, 3.0, 4) # 3.3333
3243/// ```
3244pub fn div_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3245 if args.len() != 3 {
3246 return Err(RuntimeError::WrongArity {
3247 expected: 3,
3248 got: args.len(),
3249 });
3250 }
3251
3252 match (&args[0], &args[1], &args[2]) {
3253 (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3254 if *precision < 0.0 || precision.fract() != 0.0 {
3255 return Err(RuntimeError::InvalidOperation(format!(
3256 "Precision must be a non-negative integer, got {}",
3257 precision
3258 )));
3259 }
3260
3261 if *b == 0.0 {
3262 return Err(RuntimeError::InvalidOperation(
3263 "Division by zero".to_string(),
3264 ));
3265 }
3266
3267 let multiplier = 10_f64.powi(*precision as i32);
3268 let a_rounded = (a * multiplier).round() / multiplier;
3269 let b_rounded = (b * multiplier).round() / multiplier;
3270 let result = ((a_rounded / b_rounded) * multiplier).round() / multiplier;
3271
3272 Ok(Value::Number(result))
3273 }
3274 _ => Err(RuntimeError::TypeErrorDetailed {
3275 expected: "Number, Number, Number".to_string(),
3276 got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3277 }),
3278 }
3279}
3280
3281/// 设置全局计算精度
3282///
3283/// # 功能
3284/// 对数组中的所有数字应用指定精度的四舍五入。
3285///
3286/// # 参数
3287/// - `array`: Array - 数字数组
3288/// - `precision`: Number - 精度(小数位数)
3289///
3290/// # 返回值
3291/// Array - 应用精度后的数组
3292///
3293/// # 示例
3294/// ```aether
3295/// Set nums [3.14159, 2.71828, 1.41421]
3296/// Set rounded SetPrecision(nums, 2) # [3.14, 2.72, 1.41]
3297/// ```
3298pub fn set_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3299 if args.len() != 2 {
3300 return Err(RuntimeError::WrongArity {
3301 expected: 2,
3302 got: args.len(),
3303 });
3304 }
3305
3306 match (&args[0], &args[1]) {
3307 (Value::Array(arr), Value::Number(precision)) => {
3308 if *precision < 0.0 || precision.fract() != 0.0 {
3309 return Err(RuntimeError::InvalidOperation(format!(
3310 "Precision must be a non-negative integer, got {}",
3311 precision
3312 )));
3313 }
3314
3315 let multiplier = 10_f64.powi(*precision as i32);
3316 let mut result = Vec::new();
3317
3318 for val in arr {
3319 match val {
3320 Value::Number(n) => {
3321 let rounded = (n * multiplier).round() / multiplier;
3322 result.push(Value::Number(rounded));
3323 }
3324 _ => {
3325 return Err(RuntimeError::TypeErrorDetailed {
3326 expected: "Array of Numbers".to_string(),
3327 got: format!("Array containing {:?}", val),
3328 })
3329 }
3330 }
3331 }
3332
3333 Ok(Value::Array(result))
3334 }
3335 _ => Err(RuntimeError::TypeErrorDetailed {
3336 expected: "Array, Number".to_string(),
3337 got: format!("{:?}, {:?}", args[0], args[1]),
3338 }),
3339 }
3340}