自定义单位转换器
自定义单位:建模、公式和最佳实践
定义您自己的测量单位,锚定到一个“基础单位”或其他自定义单位。建立线性因子或完整表达式模型,并为您的项目或领域组织一致的单位族系。
基本概念
基于参考的建模
您的参考是另一个自定义单位或“基础单位”。
转换表达式将输入值映射到参考单位的空间中(系统刻意设计为单位无关)。
- 维度安全通过选择一个参考,您就隐式地将该自定义单位与该族系绑定。保持族系的一致性(例如,相关单位参考相同的基础)。
- 可组合性之后可以更改参考而无需重新命名单位——只需要调整表达式。
- 可审计性每个单位都有一个单一、清晰的定义:参考 + 表达式。
因子 vs 表达式
简单单位使用一个常数因子(例如,1 foo = 0.3048 × 基础)。
高级单位可以使用带有函数的表达式(例如,10 * log(x / 1e-3))。
- 常数因子最适合固定的线性关系(长度比例、面积比率等)。
- 表达式使用数学函数处理衍生或非线性的标度(比率、对数、幂)。
- 常数内置常数如 PI, E, PHI, SQRT2, SQRT3, LN2, LN10, LOG2E, LOG10E, AVOGADRO, PLANCK, LIGHT_SPEED, GRAVITY, BOLTZMANN。
命名、符号与一致性
选择简短、明确的符号。避免与现有标准冲突。
在您的组织中记录其意图——它测量什么以及为何存在。
- 清晰度偏好使用简洁的符号(建议 1–4 个字符;用户界面最多允许 6 个)。
- 稳定性将符号视为跨数据集和 API 的稳定标识符。
- 风格在合理的情况下使用类似 SI 的大小写(例如,'foo', 'kFoo', 'mFoo')。
- 一个自定义单位 = 参考单位 + 转换表达式。
- 参考锚定维度;表达式定义数值映射。
- 对于线性标度,优先使用常数因子;特殊情况下使用表达式。
公式语言
表达式支持数字、变量 x (输入值)、别名值、常数 (PI, E, PHI, SQRT2, SQRT3, LN2, LN10, LOG2E, LOG10E, AVOGADRO, PLANCK, LIGHT_SPEED, GRAVITY, BOLTZMANN)、算术运算符和常用数学函数。表达式的计算结果为所选参考单位中的一个值。
运算符
| 运算符 | 意义 | 示例 |
|---|---|---|
| + | 加法 | x + 2 |
| - | 减法/一元负号 | x - 5, -x |
| * | 乘法 | 2 * x |
| / | 除法 | x / 3 |
| ** | 次方 (使用 **;^ 会被自动转换) | x ** 2 |
| () | 优先级 | (x + 1) * 2 |
函数
| 函数 | 签名 | 示例 |
|---|---|---|
| sqrt | sqrt(x) | sqrt(x^2 + 1) |
| cbrt | cbrt(x) | cbrt(x) |
| pow | pow(a, b) | pow(0.3048, 2) |
| abs | abs(x) | abs(x) |
| min | min(a, b) | min(x, 100) |
| max | max(a, b) | max(x, 0) |
| round | round(x) | round(x * 1000) / 1000 |
| trunc | trunc(x) | trunc(x) |
| floor | floor(x) | floor(x) |
| ceil | ceil(x) | ceil(x) |
| sin | sin(x) | sin(PI/6) |
| cos | cos(x) | cos(PI/3) |
| tan | tan(x) | tan(PI/8) |
| asin | asin(x) | asin(0.5) |
| acos | acos(x) | acos(0.5) |
| atan | atan(x) | atan(1) |
| atan2 | atan2(y, x) | atan2(1, x) |
| sinh | sinh(x) | sinh(1) |
| cosh | cosh(x) | cosh(1) |
| tanh | tanh(x) | tanh(1) |
| ln | ln(x) | ln(x) |
| log | log(x) | log(100) |
| log2 | log2(x) | log2(8) |
| exp | exp(x) | exp(1) |
| degrees | degrees(x) | degrees(PI/2) |
| radians | radians(x) | radians(180) |
| percent | percent(value, total) | percent(25, 100) |
| factorial | factorial(n) | factorial(5) |
| gcd | gcd(a, b) | gcd(12, 8) |
| lcm | lcm(a, b) | lcm(12, 8) |
| clamp | clamp(value, min, max) | clamp(x, 0, 100) |
| sign | sign(x) | sign(-5) |
| nthRoot | nthRoot(value, n) | nthRoot(8, 3) |
表达式规则
- x 是输入值;别名值也可用。
- 使用明确的乘法(例如,2 * PI,而不是 2PI)。
- 可用常数:PI, E, PHI, SQRT2, SQRT3, LN2, LN10, LOG2E, LOG10E, AVOGADRO, PLANCK, LIGHT_SPEED, GRAVITY, BOLTZMANN。
- 三角函数的角度单位是弧度(使用 degrees() 和 radians() 辅助函数进行转换)。
- 通过名称 (snake_case) 或符号引用其他自定义单位;它们当前的 toBase 值会以常数形式注入。
- 使用 ** 表示次方(引擎会自动将 ^ 转换为 **)。
- 智能输入标准化:×, ÷, π, ², ³ 会自动转换为 *, /, PI, ^2, ^3。
- 可用辅助函数:degrees(), radians(), percent(), factorial(), gcd(), lcm(), clamp(), sign(), nthRoot()。
- 增强的错误检测可防止常见错误(负数的对数、负数的平方根、除以零)。
- 自定义单位引用:在表达式中使用其他单位作为变量(例如,'x * A',其中 A 是另一个自定义单位)。
- 空白字符会被忽略;使用括号来控制优先级。
- 对于有效的输入,表达式必须产生一个有限的数值结果。
- 使用明确的乘法(例如,2 * PI)。
- 三角函数的角度单位是弧度。
- log(x) 是以 10 为底;ln(x) 是自然对数(以 e 为底)。
维度分析与策略
这个自定义系统是单位无关的。通过将相关单位锚定到同一个“基础单位”(或一个共享的参考)来建立族系模型。在您设计的族系中保持意义的一致性。
建模策略
| 策略 | 使用时机 | 说明 |
|---|---|---|
| 直接因子 | 线性关系(例如,1 foo = k × 基础)。 | 使用一个常数(没有 x)。稳定且精确。 |
| 幂次缩放 | 从一个基础标度衍生(k^2, k^3)。 | 使用 pow(k, n),其中 k 是基础标度。 |
| 比率或归一化 | 相对于一个参考水平定义的单位(例如,x / ref)。 | 对于指数类型的测量很有用;在表达式中保持 ref 的明确性。 |
| 对数标度 | 感知或功率比标度(例如,dB 风格的 10 * log(x/ref))。 | 确保定义域为正;记录参考值。 |
| 仿射映射 | 罕见的带有偏移量的情况(a * x + b)。 | 偏移量会改变零点——仅在概念上合理时应用。 |
编辑器与验证
用名称、符号(最多 6 个字符)、颜色标签、参考(基础单位或其他自定义单位)和一个因子/表达式来创建单位。编辑器会通过增强的错误检测即时验证公式,并防止循环引用。
- 参考选项包括“基础单位”和现有的自定义单位。会产生循环的不安全选项会被自动过滤掉。
- 变量:使用 x (或 value) 代表输入值。通过 snake_case 名称或符号引用其他自定义单位;它们当前的 toBase 值会以常数形式注入。
- 支持的常数:PI, E, PHI, SQRT2, SQRT3, LN2, LN10, LOG2E, LOG10E, AVOGADRO, PLANCK, LIGHT_SPEED, GRAVITY, BOLTZMANN。
- 核心函数:sqrt, cbrt, pow, abs, min, max, round, trunc, floor, ceil, sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, tanh, ln, log, log2, exp。
- 辅助函数:degrees(), radians(), percent(), factorial(), gcd(), lcm(), clamp(), sign(), nthRoot() 以增强用户体验。
- 运算符:+, -, *, /, ** 用于次方。智能输入标准化:×, ÷, π, ², ³ 会自动转换。
- 实时验证并附带预览(例如,10 x → 结果)、复杂度分类(简单/中等/复杂)和情境感知建议。
- 增强的错误检测可捕捉常见错误:非正数的对数、负数的平方根、除以零。
- 高级的循环检测可防止单位(直接或间接)依赖自身,并提供清晰的错误消息。
- 交互式帮助面板,提供分类示例、可点击的公式片段和自定义单位按钮,方便插入。
最佳实践
- 如果可能,优先使用常数因子;仅在必要时使用表达式。
- 选择一个稳定、广为人知且不太可能改变的参考单位。
- 避免循环的引用链;保持图形无环。
- 添加样本值并与独立的计算器或已知的恒等式进行交叉核对。
- 为您的组织保持符号简短、独特且有文件记录。
- 如果使用对数,请记录参考值、底数和 x 的预期定义域。
- 使用 3–5 个代表性数值进行测试,并验证来回转换。
- 避免循环引用;选择一个稳定的参考单位。
- 记录假设(定义域、偏移量、典型范围)。
入门模板与示例
这些示例说明了在这个仅限自定义的系统中常见的建模模式。请根据您的需求替换常数和参考。
| 名称 | 公式 | 参考 | 说明 |
|---|---|---|---|
| 基础比例单位 (foo) | 0.3048 | 基础单位 | 定义 1 foo = 0.3048 × 基础(简单线性因子)。 |
| 幂次缩放 (foo²) | pow(0.3048, 2) | 基础单位 | 从一个基础标度衍生(k^2)。 |
| 体积缩放 (foo³) | pow(0.3048, 3) | 基础单位 | 从一个基础标度衍生(k^3)。 |
| 来自参考的指数 | x / 42 | 基础单位 | 按一个固定水平进行归一化(定义域 x > 0)。 |
| 功率比 (dB-风格) | 10 * log(x / 0.001) | 基础单位 | 相对于 1 mW 的对数测量(示例)。确保 x > 0。 |
| 几何因子 | 2 * PI * 0.5 | 基础单位 | 常数和乘法的示例。 |
| 引用其他自定义单位 | A * 2 | 自定义单位 A | 在表达式中使用另一个单位的符号/名称作为常数。 |
| 复杂单位关系 | sqrt(x^2 + base_length^2) | 基础单位 | 使用自定义单位 'base_length' 作为常数的勾股定理关系。 |
| 带偏移量的比例单位 | x * scale_factor + offset_unit | 基础单位 | 使用另外两个自定义单位作为常数的线性转换。 |
| 参考单位的百分比 | percent(x, reference_value) | 基础单位 | 使用辅助函数将输入表示为另一个自定义单位的百分比。 |
| 受限的单位范围 | clamp(x * multiplier, min_unit, max_unit) | 基础单位 | 使用 clamp 辅助函数将数值限制在两个自定义单位常数之间。 |
| 带 GCD 的单位比率 | x / gcd(x, common_divisor) | 基础单位 | 使用 GCD 辅助函数和自定义单位常数的数学关系。 |
| 角度转换链 | degrees(x * PI / reference_angle) | 自定义角度单位 | 使用自定义角度单位和 degrees() 輔助函数转换为度。 |
治理与协作
- 维护一份经批准的自定义单位目录,包含所有者和审查日期。
- 当定义演变时使用版本控制;避免对符号进行破坏性更改。
- 记录常数和参考的来源(标准、文献、内部文件)。
- 自动化验证测试(范围检查、样本转换、单调性)。
常见问题
我应该使用常数因子还是表达式?
只要关系是线性的且固定的,就优先使用常数因子。仅在映射依赖于 x 或需要函数(幂、对数、三角函数)时才使用表达式。
我该如何选择参考单位?
选择一个稳定、广为人知且能捕捉您 intended 维度的单位(例如,长度用米,面积用平方米)。参考单位锚定维度意义。
角度是用度还是弧度?
弧度。在使用三角函数前,将度数乘以 PI/180 进行转换。
我可以链接自定义单位吗?
可以,但要避免循环。保持图形无环,并记录链接以保持清晰。