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

8.8 KiB
Raw Blame History

科学计算器功能扩展设计

日期: 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. 状态管理

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 角度模式影响

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))
  • 错误输入处理
  • 记忆功能正确性
  • 状态显示同步
  • 模式切换正确性