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().is_multiple_of(2) {
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: "Array containing non-numbers".to_string(),
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: "Array containing non-numbers".to_string(),
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            #[allow(clippy::needless_range_loop)]
2085            for i in 0..rows_a {
2086                let row_a = match &a[i] {
2087                    Value::Array(r) => r,
2088                    _ => {
2089                        return Err(RuntimeError::TypeErrorDetailed {
2090                            expected: "2D Array".to_string(),
2091                            got: "Non-uniform array structure".to_string(),
2092                        });
2093                    }
2094                };
2095
2096                let mut result_row = Vec::new();
2097                for j in 0..cols_b {
2098                    let mut sum = 0.0;
2099                    for k in 0..cols_a {
2100                        let a_val = match &row_a[k] {
2101                            Value::Number(n) => *n,
2102                            _ => {
2103                                return Err(RuntimeError::TypeErrorDetailed {
2104                                    expected: "Number".to_string(),
2105                                    got: format!("{:?}", row_a[k]),
2106                                });
2107                            }
2108                        };
2109
2110                        let row_b = match &b[k] {
2111                            Value::Array(r) => r,
2112                            _ => {
2113                                return Err(RuntimeError::TypeErrorDetailed {
2114                                    expected: "2D Array".to_string(),
2115                                    got: "Non-uniform array structure".to_string(),
2116                                });
2117                            }
2118                        };
2119
2120                        let b_val = match &row_b[j] {
2121                            Value::Number(n) => *n,
2122                            _ => {
2123                                return Err(RuntimeError::TypeErrorDetailed {
2124                                    expected: "Number".to_string(),
2125                                    got: format!("{:?}", row_b[j]),
2126                                });
2127                            }
2128                        };
2129
2130                        sum += a_val * b_val;
2131                    }
2132                    result_row.push(Value::Number(sum));
2133                }
2134                result.push(Value::Array(result_row));
2135            }
2136
2137            Ok(Value::Array(result))
2138        }
2139        _ => Err(RuntimeError::TypeErrorDetailed {
2140            expected: "Array, Array".to_string(),
2141            got: format!("{:?}, {:?}", args[0], args[1]),
2142        }),
2143    }
2144}
2145
2146/// 矩阵转置
2147///
2148/// # 功能
2149/// 计算矩阵的转置(行列互换)。
2150///
2151/// # 参数
2152/// - `matrix`: Array - 输入矩阵(二维数组)[m × n]
2153///
2154/// # 返回值
2155/// Array - 转置后的矩阵 [n × m]
2156///
2157/// # 公式
2158/// ```
2159/// B[j][i] = A[i][j]
2160/// ```
2161///
2162/// # 示例
2163/// ```aether
2164/// Set A [[1, 2, 3], [4, 5, 6]]
2165/// Set B Transpose(A)          # [[1, 4], [2, 5], [3, 6]]
2166/// Set M [[1, 2], [3, 4]]
2167/// Set MT Transpose(M)         # [[1, 3], [2, 4]]
2168/// ```
2169pub fn transpose(args: &[Value]) -> Result<Value, RuntimeError> {
2170    if args.len() != 1 {
2171        return Err(RuntimeError::WrongArity {
2172            expected: 1,
2173            got: args.len(),
2174        });
2175    }
2176
2177    match &args[0] {
2178        Value::Array(matrix) => {
2179            if matrix.is_empty() {
2180                return Ok(Value::Array(vec![]));
2181            }
2182
2183            let rows = matrix.len();
2184            let cols = match &matrix[0] {
2185                Value::Array(row) => row.len(),
2186                _ => {
2187                    return Err(RuntimeError::TypeErrorDetailed {
2188                        expected: "2D Array".to_string(),
2189                        got: format!("Array containing {:?}", matrix[0]),
2190                    });
2191                }
2192            };
2193
2194            if cols == 0 {
2195                return Ok(Value::Array(vec![]));
2196            }
2197
2198            let mut result = vec![vec![Value::Null; rows]; cols];
2199
2200            for i in 0..rows {
2201                let row = match &matrix[i] {
2202                    Value::Array(r) => r,
2203                    _ => {
2204                        return Err(RuntimeError::TypeErrorDetailed {
2205                            expected: "2D Array".to_string(),
2206                            got: "Non-uniform array structure".to_string(),
2207                        });
2208                    }
2209                };
2210
2211                if row.len() != cols {
2212                    return Err(RuntimeError::InvalidOperation(
2213                        "All rows must have same length".to_string(),
2214                    ));
2215                }
2216
2217                for j in 0..cols {
2218                    result[j][i] = row[j].clone();
2219                }
2220            }
2221
2222            let result_arrays: Vec<Value> = result.into_iter().map(Value::Array).collect();
2223
2224            Ok(Value::Array(result_arrays))
2225        }
2226        _ => Err(RuntimeError::TypeErrorDetailed {
2227            expected: "Array".to_string(),
2228            got: format!("{:?}", args[0]),
2229        }),
2230    }
2231}
2232
2233/// 计算行列式
2234///
2235/// # 功能
2236/// 计算方阵的行列式(支持 1×1、2×2、3×3 矩阵)。
2237///
2238/// # 参数
2239/// - `matrix`: Array - 方阵(二维数组)
2240///
2241/// # 返回值
2242/// Number - 行列式的值
2243///
2244/// # 公式
2245/// - 2×2: det = ad - bc
2246/// - 3×3: Sarrus规则
2247///
2248/// # 错误
2249/// - 非方阵或维度 > 3 时抛出错误
2250///
2251/// # 示例
2252/// ```aether
2253/// Set A [[1, 2], [3, 4]]
2254/// Set det Determinant(A)      # -2.0 (1*4 - 2*3)
2255/// Set I [[1, 0], [0, 1]]
2256/// Set det Determinant(I)      # 1.0 (单位矩阵)
2257/// Set B [[1, 2, 3], [0, 1, 4], [5, 6, 0]]
2258/// Set det Determinant(B)      # 1.0
2259/// ```
2260pub fn determinant(args: &[Value]) -> Result<Value, RuntimeError> {
2261    if args.len() != 1 {
2262        return Err(RuntimeError::WrongArity {
2263            expected: 1,
2264            got: args.len(),
2265        });
2266    }
2267
2268    match &args[0] {
2269        Value::Array(matrix) => {
2270            let n = matrix.len();
2271
2272            if n == 0 {
2273                return Err(RuntimeError::InvalidOperation(
2274                    "Matrix is empty".to_string(),
2275                ));
2276            }
2277
2278            // Verify square matrix
2279            for row in matrix {
2280                match row {
2281                    Value::Array(r) => {
2282                        if r.len() != n {
2283                            return Err(RuntimeError::InvalidOperation(
2284                                "Determinant requires square matrix".to_string(),
2285                            ));
2286                        }
2287                    }
2288                    _ => {
2289                        return Err(RuntimeError::TypeErrorDetailed {
2290                            expected: "2D Array".to_string(),
2291                            got: format!("Array containing {:?}", row),
2292                        });
2293                    }
2294                }
2295            }
2296
2297            // Calculate determinant based on size
2298            match n {
2299                1 => {
2300                    // 1x1 matrix
2301                    match &matrix[0] {
2302                        Value::Array(row) => match &row[0] {
2303                            Value::Number(n) => Ok(Value::Number(*n)),
2304                            _ => Err(RuntimeError::TypeErrorDetailed {
2305                                expected: "Number".to_string(),
2306                                got: format!("{:?}", row[0]),
2307                            }),
2308                        },
2309                        _ => unreachable!(),
2310                    }
2311                }
2312                2 => {
2313                    // 2x2 matrix: ad - bc
2314                    let a = get_matrix_element(matrix, 0, 0)?;
2315                    let b = get_matrix_element(matrix, 0, 1)?;
2316                    let c = get_matrix_element(matrix, 1, 0)?;
2317                    let d = get_matrix_element(matrix, 1, 1)?;
2318
2319                    Ok(Value::Number(a * d - b * c))
2320                }
2321                3 => {
2322                    // 3x3 matrix: Sarrus' rule
2323                    let a = get_matrix_element(matrix, 0, 0)?;
2324                    let b = get_matrix_element(matrix, 0, 1)?;
2325                    let c = get_matrix_element(matrix, 0, 2)?;
2326                    let d = get_matrix_element(matrix, 1, 0)?;
2327                    let e = get_matrix_element(matrix, 1, 1)?;
2328                    let f = get_matrix_element(matrix, 1, 2)?;
2329                    let g = get_matrix_element(matrix, 2, 0)?;
2330                    let h = get_matrix_element(matrix, 2, 1)?;
2331                    let i = get_matrix_element(matrix, 2, 2)?;
2332
2333                    let det = a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);
2334                    Ok(Value::Number(det))
2335                }
2336                _ => {
2337                    // For larger matrices, use recursive cofactor expansion
2338                    determinant_recursive(matrix)
2339                }
2340            }
2341        }
2342        _ => Err(RuntimeError::TypeErrorDetailed {
2343            expected: "Array".to_string(),
2344            got: format!("{:?}", args[0]),
2345        }),
2346    }
2347}
2348
2349/// 递归计算任意大小方阵的行列式(余子式展开法)
2350fn determinant_recursive(matrix: &[Value]) -> Result<Value, RuntimeError> {
2351    let n = matrix.len();
2352
2353    if n == 1 {
2354        return match &matrix[0] {
2355            Value::Array(row) => match &row[0] {
2356                Value::Number(val) => Ok(Value::Number(*val)),
2357                _ => Err(RuntimeError::TypeErrorDetailed {
2358                    expected: "Number".to_string(),
2359                    got: "Non-numeric value in matrix".to_string(),
2360                }),
2361            },
2362            _ => Err(RuntimeError::TypeErrorDetailed {
2363                expected: "Array".to_string(),
2364                got: "Invalid matrix structure".to_string(),
2365            }),
2366        };
2367    }
2368
2369    let mut det = 0.0;
2370
2371    // Expand along first row
2372    #[allow(clippy::needless_range_loop)]
2373    for j in 0..n {
2374        let element = get_matrix_element(matrix, 0, j)?;
2375
2376        // Create minor matrix (remove row 0 and column j)
2377        let mut minor = Vec::new();
2378        #[allow(clippy::needless_range_loop)]
2379        for i in 1..n {
2380            let mut row = Vec::new();
2381            match &matrix[i] {
2382                Value::Array(matrix_row) =>
2383                {
2384                    #[allow(clippy::needless_range_loop)]
2385                    for k in 0..n {
2386                        if k != j {
2387                            row.push(matrix_row[k].clone());
2388                        }
2389                    }
2390                }
2391                _ => {
2392                    return Err(RuntimeError::TypeErrorDetailed {
2393                        expected: "Array".to_string(),
2394                        got: "Invalid matrix row".to_string(),
2395                    });
2396                }
2397            }
2398            minor.push(Value::Array(row));
2399        }
2400
2401        // Recursive call
2402        let minor_det = determinant_recursive(&minor)?;
2403        let minor_val = match minor_det {
2404            Value::Number(v) => v,
2405            _ => unreachable!(),
2406        };
2407
2408        // Add to determinant with alternating signs
2409        let sign = if j % 2 == 0 { 1.0 } else { -1.0 };
2410        det += sign * element * minor_val;
2411    }
2412
2413    Ok(Value::Number(det))
2414}
2415
2416/// 矩阵求逆
2417///
2418/// # 功能
2419/// 计算方阵的逆矩阵(使用高斯-约旦消元法)。
2420///
2421/// # 参数
2422/// - `matrix`: Array - 可逆方阵(二维数组)
2423///
2424/// # 返回值
2425/// Array - 逆矩阵
2426///
2427/// # 公式
2428/// ```
2429/// A * A⁻¹ = I (单位矩阵)
2430/// ```
2431///
2432/// # 错误
2433/// - 非方阵或奇异矩阵(行列式为0)时抛出错误
2434///
2435/// # 示例
2436/// ```aether
2437/// Set A [[4, 7], [2, 6]]
2438/// Set invA Inverse(A)         # [[0.6, -0.7], [-0.2, 0.4]]
2439/// Set I Matmul(A, invA)       # [[1, 0], [0, 1]]
2440/// Set A [[1, 2, 3], [0, 1, 4], [5, 6, 0]]
2441/// Set invA Inverse(A)
2442/// ```
2443pub fn matrix_inverse(args: &[Value]) -> Result<Value, RuntimeError> {
2444    if args.len() != 1 {
2445        return Err(RuntimeError::WrongArity {
2446            expected: 1,
2447            got: args.len(),
2448        });
2449    }
2450
2451    match &args[0] {
2452        Value::Array(matrix) => {
2453            let n = matrix.len();
2454
2455            if n == 0 {
2456                return Err(RuntimeError::InvalidOperation(
2457                    "Matrix is empty".to_string(),
2458                ));
2459            }
2460
2461            // Verify square matrix and extract values
2462            let mut mat: Vec<Vec<f64>> = Vec::new();
2463            for row_val in matrix {
2464                match row_val {
2465                    Value::Array(row) => {
2466                        if row.len() != n {
2467                            return Err(RuntimeError::InvalidOperation(
2468                                "Matrix must be square".to_string(),
2469                            ));
2470                        }
2471                        let mut num_row = Vec::new();
2472                        for val in row {
2473                            match val {
2474                                Value::Number(num) => num_row.push(*num),
2475                                _ => {
2476                                    return Err(RuntimeError::TypeErrorDetailed {
2477                                        expected: "Number".to_string(),
2478                                        got: format!("{:?}", val),
2479                                    });
2480                                }
2481                            }
2482                        }
2483                        mat.push(num_row);
2484                    }
2485                    _ => {
2486                        return Err(RuntimeError::TypeErrorDetailed {
2487                            expected: "Array".to_string(),
2488                            got: format!("{:?}", row_val),
2489                        });
2490                    }
2491                }
2492            }
2493
2494            // Create augmented matrix [A | I]
2495            let mut aug = vec![vec![0.0; 2 * n]; n];
2496            for i in 0..n {
2497                for j in 0..n {
2498                    aug[i][j] = mat[i][j];
2499                    aug[i][n + j] = if i == j { 1.0 } else { 0.0 };
2500                }
2501            }
2502
2503            // Gaussian-Jordan elimination
2504            for i in 0..n {
2505                // Find pivot
2506                let mut max_row = i;
2507                for k in (i + 1)..n {
2508                    if aug[k][i].abs() > aug[max_row][i].abs() {
2509                        max_row = k;
2510                    }
2511                }
2512
2513                // Swap rows
2514                aug.swap(i, max_row);
2515
2516                // Check for singular matrix
2517                if aug[i][i].abs() < 1e-10 {
2518                    return Err(RuntimeError::InvalidOperation(
2519                        "Matrix is singular (not invertible)".to_string(),
2520                    ));
2521                }
2522
2523                // Scale pivot row
2524                let pivot = aug[i][i];
2525                #[allow(clippy::needless_range_loop)]
2526                for j in 0..(2 * n) {
2527                    aug[i][j] /= pivot;
2528                }
2529
2530                // Eliminate column
2531                #[allow(clippy::needless_range_loop)]
2532                for k in 0..n {
2533                    if k != i {
2534                        let factor = aug[k][i];
2535                        #[allow(clippy::needless_range_loop)]
2536                        for j in 0..(2 * n) {
2537                            aug[k][j] -= factor * aug[i][j];
2538                        }
2539                    }
2540                }
2541            }
2542
2543            // Extract inverse matrix from augmented matrix
2544            let mut result = Vec::new();
2545            #[allow(clippy::needless_range_loop)]
2546            for i in 0..n {
2547                let mut row = Vec::new();
2548                #[allow(clippy::needless_range_loop)]
2549                for j in n..(2 * n) {
2550                    row.push(Value::Number(aug[i][j]));
2551                }
2552                result.push(Value::Array(row));
2553            }
2554
2555            Ok(Value::Array(result))
2556        }
2557        _ => Err(RuntimeError::TypeErrorDetailed {
2558            expected: "Array".to_string(),
2559            got: format!("{:?}", args[0]),
2560        }),
2561    }
2562}
2563
2564// Helper function for matrix element access
2565fn get_matrix_element(matrix: &[Value], i: usize, j: usize) -> Result<f64, RuntimeError> {
2566    match &matrix[i] {
2567        Value::Array(row) => match &row[j] {
2568            Value::Number(n) => Ok(*n),
2569            _ => Err(RuntimeError::TypeErrorDetailed {
2570                expected: "Number".to_string(),
2571                got: format!("{:?}", row[j]),
2572            }),
2573        },
2574        _ => Err(RuntimeError::TypeErrorDetailed {
2575            expected: "Array".to_string(),
2576            got: format!("{:?}", matrix[i]),
2577        }),
2578    }
2579}
2580
2581// ============================================================================
2582// Mathematical Constants
2583// ============================================================================
2584
2585/// 圆周率 π
2586///
2587/// # 功能
2588/// 返回数学常数 π(圆周率)。
2589///
2590/// # 返回值
2591/// Number - π ≈ 3.141592653589793
2592///
2593/// # 说明
2594/// π 是圆的周长与直径的比值。
2595///
2596/// # 示例
2597/// ```aether
2598/// Set pi PI()                 # 3.141592653589793
2599/// Set circumference PI() * 2 * radius
2600/// Set angle PI() / 4          # 45度 (弧度制)
2601/// ```
2602pub fn pi(_args: &[Value]) -> Result<Value, RuntimeError> {
2603    Ok(Value::Number(consts::PI))
2604}
2605
2606/// 自然常数 e
2607///
2608/// # 功能
2609/// 返回数学常数 e(自然常数、欧拉数)。
2610///
2611/// # 返回值
2612/// Number - e ≈ 2.718281828459045
2613///
2614/// # 说明
2615/// e 是自然对数的底数。
2616///
2617/// # 示例
2618/// ```aether
2619/// Set e E()                   # 2.718281828459045
2620/// Set y Exp(1)                # 也等于 e
2621/// Set growth E() * rate       # 指数增长
2622/// ```
2623pub fn e(_args: &[Value]) -> Result<Value, RuntimeError> {
2624    Ok(Value::Number(consts::E))
2625}
2626
2627/// 圆周率 τ (TAU)
2628///
2629/// # 功能
2630/// 返回数学常数 τ = 2π。
2631///
2632/// # 返回值
2633/// Number - τ ≈ 6.283185307179586
2634///
2635/// # 说明
2636/// τ 是圆的周长与半径的比值,等于 2π。
2637///
2638/// # 示例
2639/// ```aether
2640/// Set tau TAU()               # 6.283185307179586
2641/// Set fullCircle TAU()        # 完整圆周 (360度)
2642/// Set angle TAU() / 8         # 1/8圆周 (45度)
2643/// ```
2644pub fn tau(_args: &[Value]) -> Result<Value, RuntimeError> {
2645    Ok(Value::Number(consts::TAU))
2646}
2647
2648/// 黄金比例 φ (PHI)
2649///
2650/// # 功能
2651/// 返回数学常数 φ(黄金比例)。
2652///
2653/// # 返回值
2654/// Number - φ ≈ 1.618033988749895
2655///
2656/// # 公式
2657/// ```
2658/// φ = (1 + √5) / 2
2659/// ```
2660///
2661/// # 说明
2662/// 黄金比例在几何、艺术和自然界中广泛出现。
2663///
2664/// # 示例
2665/// ```aether
2666/// Set phi PHI()               # 1.618033988749895
2667/// Set ratio PHI()             # 黄金分割比例
2668/// Set fibonacci PHI() * PHI() # φ² ≈ 2.618
2669/// ```
2670pub fn phi(_args: &[Value]) -> Result<Value, RuntimeError> {
2671    Ok(Value::Number((1.0 + 5.0_f64.sqrt()) / 2.0))
2672}
2673
2674// ============================================================================
2675// Advanced Statistics - Linear Regression
2676// ============================================================================
2677
2678/// 简单线性回归
2679///
2680/// # 功能
2681/// 对数据进行简单线性回归分析,返回斜率和截距。
2682///
2683/// # 参数
2684/// - `x`: Array - 自变量数组
2685/// - `y`: Array - 因变量数组
2686///
2687/// # 返回值
2688/// Array - [slope, intercept, r_squared]
2689/// - slope: 斜率
2690/// - intercept: 截距
2691/// - r_squared: 决定系数 R²
2692///
2693/// # 公式
2694/// ```
2695/// y = slope * x + intercept
2696/// slope = Σ[(xi - x̄)(yi - ȳ)] / Σ(xi - x̄)²
2697/// intercept = ȳ - slope * x̄
2698/// R² = 1 - SS_res / SS_tot
2699/// ```
2700///
2701/// # 错误
2702/// - 两个数组长度必须相同
2703/// - 至少需要 2 个数据点
2704///
2705/// # 示例
2706/// ```aether
2707/// Set x [1, 2, 3, 4, 5]
2708/// Set y [2, 4, 5, 4, 5]
2709/// Set result LinearRegression(x, y)
2710/// Set slope result[0]         # 0.6
2711/// Set intercept result[1]     # 2.2
2712/// Set r2 result[2]            # 0.4286
2713/// ```
2714pub fn linear_regression(args: &[Value]) -> Result<Value, RuntimeError> {
2715    if args.len() != 2 {
2716        return Err(RuntimeError::WrongArity {
2717            expected: 2,
2718            got: args.len(),
2719        });
2720    }
2721
2722    match (&args[0], &args[1]) {
2723        (Value::Array(x_arr), Value::Array(y_arr)) => {
2724            if x_arr.len() != y_arr.len() {
2725                return Err(RuntimeError::InvalidOperation(format!(
2726                    "X and Y arrays must have same length: {} vs {}",
2727                    x_arr.len(),
2728                    y_arr.len()
2729                )));
2730            }
2731
2732            if x_arr.len() < 2 {
2733                return Err(RuntimeError::InvalidOperation(
2734                    "Linear regression requires at least 2 data points".to_string(),
2735                ));
2736            }
2737
2738            // Extract numbers
2739            let mut x_vals = Vec::new();
2740            let mut y_vals = Vec::new();
2741
2742            for val in x_arr {
2743                match val {
2744                    Value::Number(n) => x_vals.push(*n),
2745                    _ => {
2746                        return Err(RuntimeError::TypeErrorDetailed {
2747                            expected: "Array of Numbers".to_string(),
2748                            got: format!("Array containing {:?}", val),
2749                        });
2750                    }
2751                }
2752            }
2753
2754            for val in y_arr {
2755                match val {
2756                    Value::Number(n) => y_vals.push(*n),
2757                    _ => {
2758                        return Err(RuntimeError::TypeErrorDetailed {
2759                            expected: "Array of Numbers".to_string(),
2760                            got: format!("Array containing {:?}", val),
2761                        });
2762                    }
2763                }
2764            }
2765
2766            let n = x_vals.len() as f64;
2767
2768            // Calculate means
2769            let x_mean = x_vals.iter().sum::<f64>() / n;
2770            let y_mean = y_vals.iter().sum::<f64>() / n;
2771
2772            // Calculate slope
2773            let mut numerator = 0.0;
2774            let mut denominator = 0.0;
2775
2776            for i in 0..x_vals.len() {
2777                let x_diff = x_vals[i] - x_mean;
2778                let y_diff = y_vals[i] - y_mean;
2779                numerator += x_diff * y_diff;
2780                denominator += x_diff * x_diff;
2781            }
2782
2783            if denominator == 0.0 {
2784                return Err(RuntimeError::InvalidOperation(
2785                    "Cannot compute regression: X values have no variance".to_string(),
2786                ));
2787            }
2788
2789            let slope = numerator / denominator;
2790            let intercept = y_mean - slope * x_mean;
2791
2792            // Calculate R²
2793            let mut ss_res = 0.0; // Residual sum of squares
2794            let mut ss_tot = 0.0; // Total sum of squares
2795
2796            for i in 0..x_vals.len() {
2797                let y_pred = slope * x_vals[i] + intercept;
2798                let residual = y_vals[i] - y_pred;
2799                ss_res += residual * residual;
2800
2801                let total_diff = y_vals[i] - y_mean;
2802                ss_tot += total_diff * total_diff;
2803            }
2804
2805            let r_squared = if ss_tot == 0.0 {
2806                1.0 // Perfect fit if no variance
2807            } else {
2808                1.0 - (ss_res / ss_tot)
2809            };
2810
2811            Ok(Value::Array(vec![
2812                Value::Number(slope),
2813                Value::Number(intercept),
2814                Value::Number(r_squared),
2815            ]))
2816        }
2817        _ => Err(RuntimeError::TypeErrorDetailed {
2818            expected: "Array, Array".to_string(),
2819            got: format!("{:?}, {:?}", args[0], args[1]),
2820        }),
2821    }
2822}
2823
2824// ============================================================================
2825// Probability Distributions
2826// ============================================================================
2827
2828/// 正态分布的概率密度函数 (PDF)
2829///
2830/// # 功能
2831/// 计算正态分布在指定点的概率密度。
2832///
2833/// # 参数
2834/// - `x`: Number - 计算点
2835/// - `mean`: Number - 均值 μ(可选,默认0)
2836/// - `std`: Number - 标准差 σ(可选,默认1)
2837///
2838/// # 返回值
2839/// Number - 概率密度值
2840///
2841/// # 公式
2842/// ```
2843/// PDF(x) = (1 / (σ√(2π))) * e^(-(x-μ)²/(2σ²))
2844/// ```
2845///
2846/// # 示例
2847/// ```aether
2848/// Set p NormalPDF(0, 0, 1)    # 标准正态分布在0点: 0.3989
2849/// Set p NormalPDF(1.96, 0, 1) # 在1.96点: 0.0584
2850/// Set p NormalPDF(10, 10, 2)  # μ=10, σ=2: 0.1995
2851/// ```
2852pub fn normal_pdf(args: &[Value]) -> Result<Value, RuntimeError> {
2853    let (x, mean, std) = match args.len() {
2854        1 => match &args[0] {
2855            Value::Number(x) => (*x, 0.0, 1.0),
2856            _ => {
2857                return Err(RuntimeError::TypeErrorDetailed {
2858                    expected: "Number".to_string(),
2859                    got: format!("{:?}", args[0]),
2860                });
2861            }
2862        },
2863        3 => match (&args[0], &args[1], &args[2]) {
2864            (Value::Number(x), Value::Number(m), Value::Number(s)) => {
2865                if *s <= 0.0 {
2866                    return Err(RuntimeError::InvalidOperation(format!(
2867                        "Standard deviation must be positive, got {}",
2868                        s
2869                    )));
2870                }
2871                (*x, *m, *s)
2872            }
2873            _ => {
2874                return Err(RuntimeError::TypeErrorDetailed {
2875                    expected: "Number, Number, Number".to_string(),
2876                    got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
2877                });
2878            }
2879        },
2880        n => {
2881            return Err(RuntimeError::WrongArity {
2882                expected: 1,
2883                got: n,
2884            });
2885        }
2886    };
2887
2888    let z = (x - mean) / std;
2889    let coefficient = 1.0 / (std * (2.0 * consts::PI).sqrt());
2890    let exponent = -0.5 * z * z;
2891    let pdf = coefficient * exponent.exp();
2892
2893    Ok(Value::Number(pdf))
2894}
2895
2896/// 正态分布的累积分布函数 (CDF)
2897///
2898/// # 功能
2899/// 计算正态分布的累积概率 P(X ≤ x)。
2900///
2901/// # 参数
2902/// - `x`: Number - 计算点
2903/// - `mean`: Number - 均值 μ(可选,默认0)
2904/// - `std`: Number - 标准差 σ(可选,默认1)
2905///
2906/// # 返回值
2907/// Number - 累积概率,范围 [0, 1]
2908///
2909/// # 公式
2910/// ```
2911/// CDF(x) = 0.5 * [1 + erf((x-μ)/(σ√2))]
2912/// ```
2913///
2914/// # 示例
2915/// ```aether
2916/// Set p NormalCDF(0, 0, 1)    # 50% (中位数)
2917/// Set p NormalCDF(1.96, 0, 1) # 97.5% (95%置信区间上界)
2918/// Set p NormalCDF(-1.96, 0, 1)# 2.5% (95%置信区间下界)
2919/// ```
2920pub fn normal_cdf(args: &[Value]) -> Result<Value, RuntimeError> {
2921    let (x, mean, std) = match args.len() {
2922        1 => match &args[0] {
2923            Value::Number(x) => (*x, 0.0, 1.0),
2924            _ => {
2925                return Err(RuntimeError::TypeErrorDetailed {
2926                    expected: "Number".to_string(),
2927                    got: format!("{:?}", args[0]),
2928                });
2929            }
2930        },
2931        3 => match (&args[0], &args[1], &args[2]) {
2932            (Value::Number(x), Value::Number(m), Value::Number(s)) => {
2933                if *s <= 0.0 {
2934                    return Err(RuntimeError::InvalidOperation(format!(
2935                        "Standard deviation must be positive, got {}",
2936                        s
2937                    )));
2938                }
2939                (*x, *m, *s)
2940            }
2941            _ => {
2942                return Err(RuntimeError::TypeErrorDetailed {
2943                    expected: "Number, Number, Number".to_string(),
2944                    got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
2945                });
2946            }
2947        },
2948        n => {
2949            return Err(RuntimeError::WrongArity {
2950                expected: 1,
2951                got: n,
2952            });
2953        }
2954    };
2955
2956    let z = (x - mean) / (std * 2.0_f64.sqrt());
2957    let erf_result = erf(&[Value::Number(z)])?;
2958
2959    match erf_result {
2960        Value::Number(erf_val) => {
2961            let cdf = 0.5 * (1.0 + erf_val);
2962            Ok(Value::Number(cdf))
2963        }
2964        _ => unreachable!(),
2965    }
2966}
2967
2968/// 泊松分布的概率质量函数 (PMF)
2969///
2970/// # 功能
2971/// 计算泊松分布在指定点的概率。
2972///
2973/// # 参数
2974/// - `k`: Number - 事件发生次数(非负整数)
2975/// - `lambda`: Number - 平均发生率 λ(必须 > 0)
2976///
2977/// # 返回值
2978/// Number - 概率值
2979///
2980/// # 公式
2981/// ```
2982/// P(X = k) = (λ^k * e^(-λ)) / k!
2983/// ```
2984///
2985/// # 应用
2986/// - 单位时间内事件发生的次数
2987/// - 稀有事件的概率模型
2988///
2989/// # 示例
2990/// ```aether
2991/// Set p PoissonPMF(3, 2.5)    # λ=2.5时,恰好3次的概率
2992/// Set p PoissonPMF(0, 1)      # 平均1次,0次发生的概率: e^(-1)
2993/// Set p PoissonPMF(5, 5)      # λ=k=5: 0.1755
2994/// ```
2995pub fn poisson_pmf(args: &[Value]) -> Result<Value, RuntimeError> {
2996    if args.len() != 2 {
2997        return Err(RuntimeError::WrongArity {
2998            expected: 2,
2999            got: args.len(),
3000        });
3001    }
3002
3003    match (&args[0], &args[1]) {
3004        (Value::Number(k), Value::Number(lambda)) => {
3005            if *k < 0.0 || k.fract() != 0.0 {
3006                return Err(RuntimeError::InvalidOperation(format!(
3007                    "k must be a non-negative integer, got {}",
3008                    k
3009                )));
3010            }
3011
3012            if *lambda <= 0.0 {
3013                return Err(RuntimeError::InvalidOperation(format!(
3014                    "Lambda must be positive, got {}",
3015                    lambda
3016                )));
3017            }
3018
3019            // Calculate k! using factorial function
3020            let fact_result = factorial(&[Value::Number(*k)])?;
3021            let k_factorial = match fact_result {
3022                Value::Number(f) => f,
3023                _ => unreachable!(),
3024            };
3025
3026            // P(X = k) = (λ^k * e^(-λ)) / k!
3027            let numerator = lambda.powf(*k) * (-lambda).exp();
3028            let pmf = numerator / k_factorial;
3029
3030            Ok(Value::Number(pmf))
3031        }
3032        _ => Err(RuntimeError::TypeErrorDetailed {
3033            expected: "Number, Number".to_string(),
3034            got: format!("{:?}, {:?}", args[0], args[1]),
3035        }),
3036    }
3037}
3038
3039// ============================================================================
3040// 带精度计算函数
3041// ============================================================================
3042
3043/// 四舍五入到指定小数位数
3044///
3045/// # 功能
3046/// 将数字四舍五入到指定的小数位数。
3047///
3048/// # 参数
3049/// - `x`: Number - 输入数字
3050/// - `digits`: Number - 小数位数(非负整数)
3051///
3052/// # 返回值
3053/// Number - 四舍五入后的数字
3054///
3055/// # 示例
3056/// ```aether
3057/// Set a RoundTo(3.14159, 2)       # 3.14
3058/// Set b RoundTo(123.456, 1)       # 123.5
3059/// Set c RoundTo(0.666666, 4)      # 0.6667
3060/// ```
3061pub fn round_to(args: &[Value]) -> Result<Value, RuntimeError> {
3062    if args.len() != 2 {
3063        return Err(RuntimeError::WrongArity {
3064            expected: 2,
3065            got: args.len(),
3066        });
3067    }
3068
3069    match (&args[0], &args[1]) {
3070        (Value::Number(x), Value::Number(digits)) => {
3071            if *digits < 0.0 || digits.fract() != 0.0 {
3072                return Err(RuntimeError::InvalidOperation(format!(
3073                    "Digits must be a non-negative integer, got {}",
3074                    digits
3075                )));
3076            }
3077
3078            let multiplier = 10_f64.powi(*digits as i32);
3079            let result = (x * multiplier).round() / multiplier;
3080            Ok(Value::Number(result))
3081        }
3082        _ => Err(RuntimeError::TypeErrorDetailed {
3083            expected: "Number, Number".to_string(),
3084            got: format!("{:?}, {:?}", args[0], args[1]),
3085        }),
3086    }
3087}
3088
3089/// 带精度加法
3090///
3091/// # 功能
3092/// 先将两个数字按指定精度四舍五入,然后进行加法运算。
3093///
3094/// # 参数
3095/// - `a`: Number - 第一个加数
3096/// - `b`: Number - 第二个加数
3097/// - `precision`: Number - 精度(小数位数)
3098///
3099/// # 返回值
3100/// Number - 结果(按精度四舍五入)
3101///
3102/// # 示例
3103/// ```aether
3104/// Set result AddWithPrecision(0.1, 0.2, 2)    # 0.30
3105/// Set result AddWithPrecision(1.235, 2.346, 2) # 3.58
3106/// ```
3107pub fn add_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3108    if args.len() != 3 {
3109        return Err(RuntimeError::WrongArity {
3110            expected: 3,
3111            got: args.len(),
3112        });
3113    }
3114
3115    match (&args[0], &args[1], &args[2]) {
3116        (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3117            if *precision < 0.0 || precision.fract() != 0.0 {
3118                return Err(RuntimeError::InvalidOperation(format!(
3119                    "Precision must be a non-negative integer, got {}",
3120                    precision
3121                )));
3122            }
3123
3124            let multiplier = 10_f64.powi(*precision as i32);
3125            let a_rounded = (a * multiplier).round() / multiplier;
3126            let b_rounded = (b * multiplier).round() / multiplier;
3127            let result = ((a_rounded + b_rounded) * multiplier).round() / multiplier;
3128
3129            Ok(Value::Number(result))
3130        }
3131        _ => Err(RuntimeError::TypeErrorDetailed {
3132            expected: "Number, Number, Number".to_string(),
3133            got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3134        }),
3135    }
3136}
3137
3138/// 带精度减法
3139///
3140/// # 功能
3141/// 先将两个数字按指定精度四舍五入,然后进行减法运算。
3142///
3143/// # 参数
3144/// - `a`: Number - 被减数
3145/// - `b`: Number - 减数
3146/// - `precision`: Number - 精度(小数位数)
3147///
3148/// # 返回值
3149/// Number - 结果(按精度四舍五入)
3150///
3151/// # 示例
3152/// ```aether
3153/// Set result SubWithPrecision(1.5, 0.3, 1)    # 1.2
3154/// Set result SubWithPrecision(5.678, 2.345, 2) # 3.33
3155/// ```
3156pub fn sub_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3157    if args.len() != 3 {
3158        return Err(RuntimeError::WrongArity {
3159            expected: 3,
3160            got: args.len(),
3161        });
3162    }
3163
3164    match (&args[0], &args[1], &args[2]) {
3165        (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3166            if *precision < 0.0 || precision.fract() != 0.0 {
3167                return Err(RuntimeError::InvalidOperation(format!(
3168                    "Precision must be a non-negative integer, got {}",
3169                    precision
3170                )));
3171            }
3172
3173            let multiplier = 10_f64.powi(*precision as i32);
3174            let a_rounded = (a * multiplier).round() / multiplier;
3175            let b_rounded = (b * multiplier).round() / multiplier;
3176            let result = ((a_rounded - b_rounded) * multiplier).round() / multiplier;
3177
3178            Ok(Value::Number(result))
3179        }
3180        _ => Err(RuntimeError::TypeErrorDetailed {
3181            expected: "Number, Number, Number".to_string(),
3182            got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3183        }),
3184    }
3185}
3186
3187/// 带精度乘法
3188///
3189/// # 功能
3190/// 先将两个数字按指定精度四舍五入,然后进行乘法运算。
3191///
3192/// # 参数
3193/// - `a`: Number - 第一个乘数
3194/// - `b`: Number - 第二个乘数
3195/// - `precision`: Number - 精度(小数位数)
3196///
3197/// # 返回值
3198/// Number - 结果(按精度四舍五入)
3199///
3200/// # 示例
3201/// ```aether
3202/// Set result MulWithPrecision(0.1, 0.2, 3)    # 0.02
3203/// Set result MulWithPrecision(3.456, 2.5, 2)  # 8.64
3204/// ```
3205pub fn mul_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3206    if args.len() != 3 {
3207        return Err(RuntimeError::WrongArity {
3208            expected: 3,
3209            got: args.len(),
3210        });
3211    }
3212
3213    match (&args[0], &args[1], &args[2]) {
3214        (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3215            if *precision < 0.0 || precision.fract() != 0.0 {
3216                return Err(RuntimeError::InvalidOperation(format!(
3217                    "Precision must be a non-negative integer, got {}",
3218                    precision
3219                )));
3220            }
3221
3222            let multiplier = 10_f64.powi(*precision as i32);
3223            let a_rounded = (a * multiplier).round() / multiplier;
3224            let b_rounded = (b * multiplier).round() / multiplier;
3225            let result = ((a_rounded * b_rounded) * multiplier).round() / multiplier;
3226
3227            Ok(Value::Number(result))
3228        }
3229        _ => Err(RuntimeError::TypeErrorDetailed {
3230            expected: "Number, Number, Number".to_string(),
3231            got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3232        }),
3233    }
3234}
3235
3236/// 带精度除法
3237///
3238/// # 功能
3239/// 先将两个数字按指定精度四舍五入,然后进行除法运算。
3240///
3241/// # 参数
3242/// - `a`: Number - 被除数
3243/// - `b`: Number - 除数(不能为0)
3244/// - `precision`: Number - 精度(小数位数)
3245///
3246/// # 返回值
3247/// Number - 结果(按精度四舍五入)
3248///
3249/// # 示例
3250/// ```aether
3251/// Set result DivWithPrecision(1.0, 3.0, 2)    # 0.33
3252/// Set result DivWithPrecision(10.0, 3.0, 4)   # 3.3333
3253/// ```
3254pub fn div_with_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3255    if args.len() != 3 {
3256        return Err(RuntimeError::WrongArity {
3257            expected: 3,
3258            got: args.len(),
3259        });
3260    }
3261
3262    match (&args[0], &args[1], &args[2]) {
3263        (Value::Number(a), Value::Number(b), Value::Number(precision)) => {
3264            if *precision < 0.0 || precision.fract() != 0.0 {
3265                return Err(RuntimeError::InvalidOperation(format!(
3266                    "Precision must be a non-negative integer, got {}",
3267                    precision
3268                )));
3269            }
3270
3271            if *b == 0.0 {
3272                return Err(RuntimeError::InvalidOperation(
3273                    "Division by zero".to_string(),
3274                ));
3275            }
3276
3277            let multiplier = 10_f64.powi(*precision as i32);
3278            let a_rounded = (a * multiplier).round() / multiplier;
3279            let b_rounded = (b * multiplier).round() / multiplier;
3280            let result = ((a_rounded / b_rounded) * multiplier).round() / multiplier;
3281
3282            Ok(Value::Number(result))
3283        }
3284        _ => Err(RuntimeError::TypeErrorDetailed {
3285            expected: "Number, Number, Number".to_string(),
3286            got: format!("{:?}, {:?}, {:?}", args[0], args[1], args[2]),
3287        }),
3288    }
3289}
3290
3291/// 设置全局计算精度
3292///
3293/// # 功能
3294/// 对数组中的所有数字应用指定精度的四舍五入。
3295///
3296/// # 参数
3297/// - `array`: Array - 数字数组
3298/// - `precision`: Number - 精度(小数位数)
3299///
3300/// # 返回值
3301/// Array - 应用精度后的数组
3302///
3303/// # 示例
3304/// ```aether
3305/// Set nums [3.14159, 2.71828, 1.41421]
3306/// Set rounded SetPrecision(nums, 2)   # [3.14, 2.72, 1.41]
3307/// ```
3308pub fn set_precision(args: &[Value]) -> Result<Value, RuntimeError> {
3309    if args.len() != 2 {
3310        return Err(RuntimeError::WrongArity {
3311            expected: 2,
3312            got: args.len(),
3313        });
3314    }
3315
3316    match (&args[0], &args[1]) {
3317        (Value::Array(arr), Value::Number(precision)) => {
3318            if *precision < 0.0 || precision.fract() != 0.0 {
3319                return Err(RuntimeError::InvalidOperation(format!(
3320                    "Precision must be a non-negative integer, got {}",
3321                    precision
3322                )));
3323            }
3324
3325            let multiplier = 10_f64.powi(*precision as i32);
3326            let mut result = Vec::new();
3327
3328            for val in arr {
3329                match val {
3330                    Value::Number(n) => {
3331                        let rounded = (n * multiplier).round() / multiplier;
3332                        result.push(Value::Number(rounded));
3333                    }
3334                    _ => {
3335                        return Err(RuntimeError::TypeErrorDetailed {
3336                            expected: "Array of Numbers".to_string(),
3337                            got: format!("Array containing {:?}", val),
3338                        });
3339                    }
3340                }
3341            }
3342
3343            Ok(Value::Array(result))
3344        }
3345        _ => Err(RuntimeError::TypeErrorDetailed {
3346            expected: "Array, Number".to_string(),
3347            got: format!("{:?}, {:?}", args[0], args[1]),
3348        }),
3349    }
3350}