Forms — interactive mathematics. Four handles, one expression.
- Rust 46.5%
- JavaScript 20.7%
- TypeScript 17.1%
- HTML 10.4%
- Python 3.5%
- Other 1.8%
No f64 is snapped to a fraction anywhere in the engine. math_fns::f64_to_rational
and solve.rs approx_rational are deleted; f64_to_term becomes f64_to_real.
Exact where the mathematics is exact, computed without f64:
- sin, cos, tan at k*pi/n for n in 1, 2, 3, 4, 6, in the form the engine gives
sqrt(3)/2 itself; tan at odd multiples of pi/2 is undefined
- exp(0), ln(1), ln(e), log, log10 and log2 of powers of the base, cbrt of cubes
- abs, floor, ceil, round (half away from zero), sign; min and max return the
winning argument; exact ordering for exact numbers
- mean, median, variance (n - 1), stdev as sqrt of the exact variance
- not, the fuzzy and Lukasiewicz family
- sum and product exact up to 10,000 terms, a Real beyond
Everything else is a Real: exp(-30) is 9.35762296884017e-14, not 0.
The linear solver keeps constant coefficients as terms: solve(pi*x = 1, x) is
1/pi, solve(exp(-30)*x = 1, x) is exp(30) (it was "no solution"). It divides only
by a coefficient known nonzero (simplify::is_nonzero_constant, shared with the
cancellation rule; an f64 test until the precision ladder).
catalog::FnEntry gains returns (Integer, ExactForExact, Approximate, Structure)
on all 103 entries; tests/catalog_coverage.rs enforces it on the answer path.
Answer ratchet rebaselined (seed 1, 4200 cases), every move traced case by case
against a build of
|
||
|---|---|---|
| .claude | ||
| assets | ||
| docs/decisions | ||
| manual | ||
| math-core | ||
| math-wasm | ||
| public | ||
| scripts | ||
| sources | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| check.sh | ||
| favicon.png | ||
| index.html | ||
| manual.json | ||
| no-dead-symbols.md | ||
| package-lock.json | ||
| package.json | ||
| ROADMAP.md | ||
| style.css | ||
| tsconfig.json | ||
| tsconfig.test.json | ||
| vite.config.ts | ||