README.md (5723B)
1 # Calculadora natural (estilo Casio fx-991) 2 3 Calculadora científica para la terminal, una ventana SDL y la PicoCalc, con el mismo 4 núcleo. La cuenta se ve como se escribe (fracciones apiladas, raíces, exponentes) y 5 los resultados salen exactos cuando se puede: `1/3+1/6 = 1/2`, `√8 = 2√2`, 6 `sin 60° = √3/2`, `asin(1/2) = π/6`. Tab (S⇔D) los pasa a decimal. 7 8 ```sh 9 make # ./calc (terminal) y ./calc-picosim 10 ./calc # terminal 11 ./calc --gui # ventana (la misma pantalla que la PicoCalc) 12 ./calc --eval '\f{1}{3}+\r{8}' # exacto y decimal en la consola 13 make test # ./calc --selftest (números, exactos, edición, modos) 14 ./calc --selftest --deep # 20 000 argumentos al azar por función 15 make debug && make test # con ASan/UBSan 16 make check-arm # que el núcleo compile para el RP2040, con tamaños 17 make pico # sd/firmware/Calculadora.bin, sd/pico1-apps/Calculadora.uf2, CALC.LOG/.SAV 18 tools/shot.sh "1/3}+1/6~" f.png # captura del simulador sin ventana 19 ``` 20 21 ## Cómo se escribe 22 23 Se tipea como en la compu y la forma natural se arma sola; también hay casillas 24 vacías según el contexto, como en la Casio: 25 26 | Tecla | Hace | 27 |---|---| 28 | `/` | fracción: toma lo de la izquierda como numerador (`12/3`, `(1+x)/2`); al principio o después de un operador, □/□ vacía | 29 | `^` | exponente (`2^3`); `+ - × ÷ )` al final del exponente o denominador tipeado salen solos | 30 | `#`, `$`, `\|`, `;` | √□, raíz n-ésima, valor absoluto, fracción mixta | 31 | `sqrt(` `cbrt(` `abs(` `logb(` `exp(` | también arman la plantilla; `)` sale de ella | 32 | `pi`, `ans`, `sin(`… | se convierten solos al tipear | 33 | `integ(` `deriv(` `sum(` `prod(` | ∫ₐᵇ f dx, d/dx f en un punto, Σ y Π con la variable X; la `,` pasa al campo siguiente: `integ(0,1,x^2)`, `deriv(x^3,2)`, `sum(1,10,1/x^2)` | 34 | `*` `:` `[` | ×, ÷, ×10ⁿ | 35 | `A`-`F`, `M`, `X`, `Y` | variables; `x` minúscula también es X | 36 | `>` y una letra | guarda el resultado en esa variable (STO) | 37 | Enter / Esc / Retroceso / Supr | = / AC / borrar / borrar adelante | 38 | Tab o F4 | S⇔D (en Programador: cambia la base) | 39 | `@` o F2 | menú de modos; `?` o F3: catálogo de funciones; F5: ajustes; `` ` `` o F1: SHIFT | 40 | ↑ ↓ | se mueven por la fracción; si no hay fila, recorren el historial | 41 42 SHIFT+Enter da el resultado en decimal; SHIFT+`#` pone ∛ y SHIFT+`^` pone x⁻¹. 43 44 ## Modos 45 46 1. **Calcular**: historial (se guarda), Ans, PreAns, variables, formatos Norm/Fix/Sci/Eng. 47 Análisis como en la fx-991: integral definida (Gauss-Kronrod 7-15 adaptativo), derivada en 48 un punto (diferencia central con extrapolación de Richardson), Σ y Π (exactas si los 49 términos lo son; hasta 100 000 términos). Se pueden anidar hasta 3 niveles. 50 2. **Ecuaciones**: sistemas 2×2 y 3×3 (exactos), polinomios de grado 2 y 3 (raíces 51 racionales y con radicales exactas, complejas como a+bi, vértice) y SOLVE con X. 52 3. **Tabla**: f(x) y g(x) con inicio, fin y paso (hasta 45 filas). 53 4. **Gráfico**: f(x) y g(x), traza con ← →, zoom con + -, ventana con `w`, y automática. 54 En la terminal se dibuja con medios bloques. 55 5. **Programador**: entrada en DEC/HEX/BIN/OCT (Tab), 32 bits con signo, `and or xor xnor`, 56 `not( neg(`; el resultado se ve en las cuatro bases. 57 6. **Estadística**: 1 variable y regresiones lineal, cuadrática, logarítmica, exponencial, 58 a·bˣ, potencia e inversa; x̂( e ŷ( en Calcular usan la última regresión. 59 7. **Complejos**: `i` es la unidad imaginaria y `<` pone ∠ (forma polar r∠θ). Con un resultado 60 en pantalla, `<` alterna a+bi ↔ r∠θ. √ de negativos, arg(, Conjg(, ReP(, ImP(, |z|, potencias; 61 exacto cuando se puede (`2∠60 = 1+√3i`, `(2+i)⁻¹ = 2/5−1/5i`). 62 8. **Matrices**: MatA-D (hasta 4×4) y VctA-D (2 o 3 elementos); `=` las define. En las cuentas, 63 `A`-`D` escriben MatA-D y SHIFT + letra, VctA-D. Suma, producto (también matriz×vector), 64 potencias, x⁻¹ (inversa), Det(, Trn(, Identity(, DotP(, CrossP(, Angle(, UnitV(, |v|. 65 Con datos racionales el determinante y la inversa salen en fracciones exactas. 66 67 En cualquier modo: 68 - **Distribuciones** (catálogo `?`): NormPD(x,σ,μ), NormCD(a,b,σ,μ), InvN(área,σ,μ), 69 BinomPD/CD(x,n,p), PoissPD/CD(x,λ). 70 - **Sexagesimal**: `'` escribe ° (`12'30'45'` = 12°30′45″); con un resultado en pantalla, `'` 71 lo muestra como grados, minutos y segundos. 72 73 ## Arquitectura 74 75 - `core/` (C99 sin malloc ni stdio ni float, como `catan/core`): 76 - `dec.c`: decimal de 18 dígitos (15 que se muestran y 3 de guarda); 77 - `dmath.c`: funciones, con reducción Cody-Waite y series; 78 - `exact.c`: (a+b√r)/d·π^p en int64 con chequeo de desborde; 79 - `num.c`: decimal + exacto; 80 - `expr.c`: la expresión editable, tokens con plantillas, y su texto `\f{1}{3}`; 81 - `compile.c` / `eval.c`: RPN con las precedencias de la Casio; 82 - `fmt.c`: formato del resultado; 83 - `layout.c`: disposición 2D con métrica de píxeles o de celdas; 84 - `calc.c`: estado y teclas compartidas; 85 - `modes.c`: los modos; 86 - `persist.c`: guardado en texto. 87 - `gfx/`: pantalla de 320x320 (PicoCalc, simulador y ventana) con la fuente propia `calcfont.c` 88 (generada por `tools/mkcalcfont.py` desde misc-fixed ISO10646: trae π √ ≤ Σ, etc.). 89 - `linux/`: terminal (`tui.c`, `tui_modes.c`), ventana (`gui.c`), guardado en 90 `~/.local/share/calc/calc.sav`, selftest. 91 - `pico/app.c`: bucle sobre `hal.h`; guarda en `CALC.SAV` 2 s después del último cambio. 92 Pide las teclas extendidas (`hal_keys_ext`): Supr, F1-F10, Inicio/Fin. Los códigos del 93 teclado de la PicoCalc no están confirmados: Ajustes → "Probar el teclado" los muestra.