Files
vscode-workbench/docs/superpowers/specs/2026-07-28-scientific-calculator-design.md
T

252 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 科学计算器功能扩展设计
**日期**: 2026-07-28
**状态**: 待实现
**范围**: 桌面端 CalculatorDesktop 组件(移动端 CalculatorMobile 保持不变)
---
## 1. 背景
当前计算器仅支持基础四则运算和简单的 ±、%、√ 功能。用户希望扩展为完整的科学计算器,参考主流科学计算器(Windows 计算器 / Calculator.net / Casio fx-991)的标准功能集。
## 2. 设计原则
- **桌面端优先**:科学函数仅修改 CalculatorDesktop,CalculatorMobile 保持现有基础布局
- **功能完整**:覆盖三角/反三角/对数/幂/根/阶乘/记忆等完整科学计算功能
- **模式切换**:顶部有基础/科学模式切换,保持原有 4 列布局宽度不变
- **错误安全**:所有数学错误友好显示 "Error",不崩溃
## 3. 功能规格
### 3.1 三角函数
| 按键 | 函数 | 说明 |
|------|------|------|
| sin | sin(x) | 正弦,支持DEG/RAD模式 |
| cos | cos(x) | 余弦,支持DEG/RAD模式 |
| tan | tan(x) | 正切,支持DEG/RAD模式 |
| sin⁻¹ | asin(x) | 反正弦,2nd切换 |
| cos⁻¹ | acos(x) | 反余弦,2nd切换 |
| tan⁻¹ | atan(x) | 反正切,2nd切换 |
**DEG/RAD 模式**:
- 默认 DEG(角度制),按键切换
- 显示区域有 DEG/RAD 指示器
- 内部统一用 RAD 计算:RAD = DEG × π/180
### 3.2 对数与指数
| 按键 | 函数 | 说明 |
|------|------|------|
| log | log₁₀(x) | 常用对数,x > 0 |
| ln | ln(x) | 自然对数,x > 0 |
| x² | x² | 平方 |
| x³ | x³ | 立方 |
| xʸ | x^y | 任意次幂(双目运算) |
| e^x | eˣ | 指数函数(常数e为底的幂),2nd+ln 切换 |
### 3.3 根号
| 按键 | 函数 | 说明 |
|------|------|------|
| √ | √x | 平方根,x ≥ 0 |
| ³√ | ³√x | 立方根 |
| x√y | y√x | N次方根(双目运算) |
### 3.4 其他数学函数
| 按键 | 函数 | 说明 |
|------|------|------|
| n! | x! | 阶乘,非负整数;大数用 gamma 函数近似 |
| 1/x | 1/x | 倒数 |
| \|x\| | abs(x) | 绝对值 |
| % | x% | 百分比(除以100) |
| ± | -x | 取反 |
| ( ) | 括号 | 改变运算优先级 |
### 3.5 常数
| 按键 | 值 | 说明 |
|------|-----|------|
| π | 3.14159265358979 | 圆周率 |
| e | 2.71828182845905 | 自然常数 |
### 3.6 记忆功能
| 按键 | 功能 | 说明 |
|------|------|------|
| MC | Memory Clear | 清除记忆(设为0) |
| MR | Memory Recall | 读取记忆值到当前显示 |
| M+ | Memory Add | 当前值加到记忆 |
| M− | Memory Subtract | 当前值从记忆减去 |
**状态指示**:记忆值 ≠ 0 时,显示区有 "M" 标记。
### 3.7 角度模式切换
- 按键:DEG ↔ RAD(同一个按键切换)
- 影响:sin/cos/tan 的计算方式
- 显示:当前模式显示在 display 区域
### 3.8 反函数模式(2nd)
- 按键:2nd(切换键)
- 效果:sin→sin⁻¹, cos→cos⁻¹, tan→tan⁻¹, x²→x³, √→³√, xʸ→x√y
- 视觉:激活时按键背景变为 #6366f1,文字变白,表示反函数模式开启
## 4. UI 设计
### 4.1 布局(方案 B · 模式切换式)
- 宽度:保持 460px 不变
- 4列网格布局
- 顶部增加模式切换标签栏:基础 / 科学
- 基础模式:显示原有基础键盘
- 科学模式:在数字键上方显示科学函数区
### 4.2 模式切换标签栏
```
┌────────────────────────────────────────────┐
│ [ 基础 ] [ 科学 ] DEG/RAD │ ← 模式切换 + 角度模式
├────────────────────────────────────────────┤
│ │
│ Display 区域 │
│ │
├────────────────────────────────────────────┤
│ sin │ cos │ tan │ log │ ← 科学函数行 │
├──────┼─────┼─────┼─────┤ │
│ 7 │ 8 │ 9 │ ÷ │ ← 数字键盘 │
├──────┼─────┼─────┼─────┤ │
│ 4 │ 5 │ 6 │ × │ │
├──────┼─────┼─────┼─────┤ │
│ 1 │ 2 │ 3 │ − │ │
├──────┼─────┼─────┼─────┤ │
│ ± │ 0 │ . │ + │ │
├──────┼─────┼─────┼─────┤ │
│ √ │ AC │ ( │ ) │ ← 功能键 │
├──────┼─────┼─────┼─────┤ │
│ = │ π │ e │ % │ │
└──────┴─────┴─────┴─────┘
```
### 4.3 按键分类配色
| 类型 | 背景色 | 文字色 | 示例 |
|------|--------|--------|------|
| 数字键 | #1e2538 | #cbd5e1 | 0-9, . |
| 三角函数 | rgba(99,102,241,0.12) | #a5b4fc | sin, cos, tan |
| 对数/指数 | rgba(139,92,246,0.12) | #c4b5fd | log, ln, xʸ |
| 记忆功能 | rgba(34,197,94,0.1) | #86efac | MC, MR, M+, M− |
| 运算符 | rgba(14,165,233,0.1) | #7dd3fc | +, −, ×, ÷ |
| 等号 | 渐变(#6366f1, #8b5cf6) | #fff | = |
| 清除 | #1e2538 | #fca5a5 | AC |
### 4.4 Display 区域扩展
```
┌────────────────────────────────────────────┐
│ DEG M history │ ← 状态栏
│ 12 + 8 = │ ← 历史
│ 20 │ ← 当前值
└────────────────────────────────────────────┘
```
## 5. 状态管理
```typescript
interface CalculatorState {
current: string; // 当前显示值(字符串用于保持精度)
previous: string; // 上一个值(双目运算)
operator: Operator | null; // 当前二元运算符
overwrite: boolean; // 是否覆盖当前输入
history: string; // 历史表达式显示
memory: number; // 记忆存储值
angleMode: 'DEG' | 'RAD'; // 角度/弧度模式
invMode: boolean; // 反函数模式(2nd键)
parenOpen: boolean; // 是否有未闭合的括号
mode: 'basic' | 'scientific'; // 当前模式
}
type Operator = '+' | '-' | '*' | '/' | '^' | 'root';
```
### 5.1 状态转换
```
单目运算 (sin, √, x², n!, ...):
current → f(current) → current (overwrite=true)
双目运算选择 (+, −, ×, ÷, xʸ, x√y):
previous ← current
operator ← op
overwrite ← true
等号按下:
current ← compute(previous, current, operator)
previous ← ""
operator ← null
```
### 5.2 角度模式影响
```typescript
const toRad = (val: number) =>
angleMode === 'DEG' ? val * Math.PI / 180 : val;
const fromRad = (val: number) =>
angleMode === 'DEG' ? val * 180 / Math.PI : val;
// sin 实现
const sin = (val: number) => Math.sin(toRad(val));
// sin⁻¹ 实现
const asin = (val: number) => fromRad(Math.asin(val));
```
## 6. 错误处理
| 错误场景 | 处理 |
|----------|------|
| 负数开平方根 | message.error + 显示 "Error" |
| log(0) 或 log(负数) | 显示 "Error" |
| tan(90°) 等无定义点 | 显示 "Error" |
| 除以零 | 显示 "Error" |
| 阶乘(负数/非整数过大) | gamma 近似或显示 "Error" |
| 数值溢出 | 使用 toExponential(8) 显示 |
## 7. 文件变更
### 7.1 修改文件
- `src/pages/Calculator/Calculator.tsx`:扩展 CalculatorDesktop 组件
- `src/pages/Calculator/Calculator.css`:新增科学函数按键样式、扩展布局
### 7.2 不修改
- `src/pages/Calculator/CalculatorMobile.tsx`:保持现有基础布局
- 其他组件
## 8. 实现顺序
1. 新增模式切换标签栏组件和样式
2. 状态扩展:添加 mode, memory, angleMode, invMode, parenOpen
3. 单目函数:sin/cos/tan/log/ln/x²/x³/√/n!/1/x/±/%
4. 双目函数:xʸ/x√y(需要特殊处理运算顺序)
5. 常数:π/e
6. 记忆功能:MC/MR/M+/M−
7. 角度模式:DEG/RAD 切换 + 指示器
8. 反函数:2nd 切换 + 按键文字变化
9. 括号:( ) 支持
10. 显示扩展:状态栏(DEG/RAD, M)
## 9. 测试要点
- 基础四则运算回归测试
- 三角函数在 DEG/RAD 模式下的正确性
- 连续运算(如 sin(30) + cos(60))
- 错误输入处理
- 记忆功能正确性
- 状态显示同步
- 模式切换正确性