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}