LSR 010 - 虚数单位与复数规范¶
基本信息¶
LSR 编号 010
标题 虚数单位与复数规范
作者 Ziyang-Bai
状态 草案
类型 标准规范
创建日期 07-28-2026
归属项目 编译器、标准库、CAS
摘要¶
定义虚数单位 I、复数字面量、num 上的 complex 值约束,以及复数主值、顺序和符号运算边界 [1] [2]。复数与精确数、符号表达式和近似值共用数学基本静态类型 num。
技术规范¶
1. 设计目标¶
明确
3 + 4I的语法含义避免虚数单位与普通变量或
sym声明冲突在统一的
num数学值语义中保留实数与复数的数域区别为标准库及 CAS 提供复数构造、主值函数和集合多结果的确定语义
2. 虚数单位¶
I 是预定义虚数单位,满足数学关系 I^2 == -1。
I的基本静态类型是num,其值满足complex约束I是预定义常量,不是普通变量;用户不得在同一作用域重新绑定它sym I非法,必须报错ImaginaryUnitReserved小写
i是普通标识符,可以作为变量名或通过sym i声明为符号标准库在
std.math中以I导出同一常量;该导出不创建另一个虚数单位
3. 复数字面量¶
虚数字面量由数值字面量紧跟后缀 I 构成,中间不得有空白。
let a = 4I
let b = 3 + 4I
let c = -2.5I
let d = 1/2 + 3/4I
4I等价于4 * I3 + 4I等价于std.math.complex(3, 4)所构造的数学值3 + 4 * I同样合法,按普通乘法解析4 I非法,必须报错ComplexLiteralSpacing虚数字面量及其组合的基本静态类型均为
num;有限小数字面量默认精确,不因虚数后缀进入近似计算
4. 复数值约束¶
complex 表示 num 上的复标量值约束,不是独立基本数学类型。real、int、frac 同样是数学值约束;在数域意义上实数属于复数,但不存在从一种基本静态数学类型到另一种类型的自动提升。
use std.math.{conj}
func conjugate(z complex) -> complex {
return conj(z)
}
let a complex = 3 + 4I
let b num = a + 2
a、b 及函数参数、返回值的基本类型均为 num。z complex 与 -> complex 分别要求参数及返回值为复标量。vector<complex> 表示元素满足该约束的 vector<num>,不创建独立复数容器基本类型。
约束参与调用及返回校验:静态可证时提前检查,其余在运行期验证。确定违反约束报 DomainError 或 InvalidArgument,仍未决报 Inconclusive。具有相同基本签名及参数个数的函数不能仅凭 real、complex 等值约束静态分派,也不提供自动按值重载。
函数类型兼容还须保留参数值约束及量纲契约,不能仅因基本类型同为 num 就把受约束参数放宽。
复数可写为实部与虚部的数学组合 a + b*I,其中两部分满足 real 约束。实现可使用复数数值表示或符号节点,不强制固定存储布局;涉及 FFI 时由其显式 ABI 声明另行规定表示和范围检查。
5. 符号、精确值与近似值¶
sym 默认声明复数标量符号;实性、正性和整数性通过显式假设或约束提供 [3]。
use std.math.{conj}
sym x
let z num = x + 2I
let c num = conj(z)
I始终表示虚数单位,不参与普通符号变量绑定精确实数与精确复数运算默认精确、保域;支持域内不能完成的数学调用可保留未求值式
带未绑定数学符号的表达式仍是合法
num,不需要转换到另一种符号基本类型具体数值提取接口可要求所有必要符号已绑定;未满足时按该接口的错误契约诊断,不进行所谓类型降级
只有显式
std.math.approximate(value, precision=100)进入近似,精度为目标十进制有效位数 [2]有近似操作数时发生局部近似传播,采用参与近似值的最高工作精度,未知符号部分继续保留;提高工作精度不恢复输入已经丢失的精度
6. 主值与顺序¶
复平方根、复对数及复非整数幂是单值主值函数:
对非零复数采用主辐角
Arg(z) ∈ (-π, π]log(z) = ln(|z|) + I*Arg(z);log(0)无定义sqrt(z)取实部非负的平方根;实部为零时取虚部非负者,且sqrt(0) = 0非零底数的复非整数幂按
z^w = exp(w*log(z))的主值解释;整数幂遵循整数幂定义,零底数的有效指数域按核心数学规则处理
不得把单值主值函数的结果解释为全部根或全部分支。所有根或解由显式集合求解接口返回,元素基本类型为 num [4]。
复数不提供与实数顺序兼容的无条件 <、<=、>、>=。顺序关系及排序必须满足实数等已声明有序数域的条件:已知非实复数参与实序比较时报告 DomainError;数域尚未确定时可保留符号关系,不能任意选取按实部、模长或存储布局的次序。若普通控制流必须判真而仍未决,报告 Inconclusive [1]。
7. 关系、结构与等价¶
==、!=构造num数学关系std.cas.same_structure返回结构查询的bool;精确数字叶按数学数值比较,不依赖内部复数布局===与std.cas.equivalent返回固定三态std.cas.Equivalence,证明未决是cas.Unknown精确值与近似值无损比较各自现有存储数值,不预先舍入或加入容差;结论不追溯至近似前原式
import std.cas
let relation num = I * I == -1
let proof = (I * I) === -1
let proved bool = proof == cas.Equivalent
I^2 -> -1 属于 Core 基础规则,因此该例的 proof 为 cas.Equivalent。近似节点的结构比较还区分近似类别和工作精度,并与精确叶区别。
8. 标准库要求¶
std.math 必须暴露以下接口。签名中的 real、complex 均为 num 值约束,不是基本类型:
名称 |
声明 |
说明 |
|---|---|---|
|
|
虚数单位 |
|
|
以实部与虚部构造复标量 |
|
|
实部 |
|
|
虚部 |
|
|
共轭 |
|
|
非负模长 |
函数名 complex、real 在调用位置分别表示构造或查询函数,在标注位置表示值约束。已声明数学函数可按其支持域返回未求值的 num 调用;不能因期望数学值而吞掉未绑定函数名。
9. 错误模型¶
ImaginaryUnitReserved:尝试绑定或声明IComplexLiteralSpacing:虚数字面量后缀前存在非法空白ComplexTypeMismatch:复数接口收到不兼容的基本类型DomainError/InvalidArgument:确定违反复标量、实部或有序数域等要求Inconclusive:必须验证的值约束或控制流条件仍未决
具体数值提取遇到未绑定符号时可报告 ComplexEvalUnboundSymbol,但普通符号数学运算不得因此报错。数学错误及运行时故障按 LSR-018 传播 [6]。