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}