pricingapi · benchmark

El coste de la determinidad

La misma fórmula de bono (cupón 100, nominal 1000, y=4.3%, 12 años) implementada en cuatro plataformas float64 y en nuestra VM. Medimos bits (no decimales), divergencia y velocidad. Publicamos también lo que no nos favorece — la credibilidad es el producto.

Windows x64 · Node 24.14 · Python 3.12 · Rust 1.95 · 2026-09-10 · scripts reproducibles más abajo.

La matriz de bits

PlataformaP (bits)¿Igual al baseline?ns/ejec
Node/V8, suma ascendente — baseline4097d707119bcbf5—175
Node/V8, suma descendente4097d707119bcbf4NO — 1 ULP148
Python/CPython4097d707119bcbf5sí1 605
Rust nativo (powf)4097d707119bcbf5sí126
Rust nativo (powi)4097d707119bcbf5sí127
VMS7 — esta máquina (takum32, u32)5b7d7072clase takum1 339 251
VMS7 — el edge de Cloudflare (otra máquina, otra infra)5b7d7072IDÉNTICO a local ✓ (steps 24195 en ambos)—

Decimales: float64 → 1525.7569031089054 · VMS7 → 1525.7569580078125.

Lo que encontramos (sin maquillaje)

1. Las tres plataformas float64 coincidieron en bits — los libm modernos convergen en pow. El mito del "float siempre diverge entre lenguajes" no se materializó aquí, y no lo vamos a fingir.

2. El orden de la suma sí dividió 1 ULP (asc vs desc: …bf5 vs …bf4). Ese es el peligro real: vectorización, paralelización o un refactor que reordene la acumulación cambia tu resultado en silencio — y un auditor no puede explicarlo después.

3. La VM dio bits idénticos en dos máquinas distintas: esta PC y el edge de Cloudflare (otra infraestructura completa). Mismo decimal, mismos steps — el receipt es la prueba, no la promesa.

4. El coste: VMS7 es ~800–7 600× más lenta que float64 nativo en esta carga. Absoluto: 1.34 ms por precio. Compras receipts y salida bit-estable entre máquinas con milisegundos que tu caso de uso no notará.

5. Honestidad de clases: takum32 tiene 20 bits de fracción (float64: 52). No competimos en precisión con float64 — competimos en determinismo verificable, receipts y rango acotado. Para precios en céntimos, la precisión sobra.

Limitaciones declaradas (v1)

Una sola máquina física para los floats (el eje cross-machine float64 requiere hardware ajeno — v2). Sin MPFR/SoftPosit (toolchain C — v2). Sin wasmtime ni zkVM (v2). La fórmula float y el contrato VMS7 pueden diferir en algoritmo interno — la comparación float64↔takum es entre CLASES de formato, no entre implementaciones idénticas.

Reprodúcelo tú mismo

Node (el flag desc activa la acumulación descendente — la fila divergente):

node bond_node.mjs
node bond_node.mjs desc
python bond_python.py
rustc -O bond_rust.rs -o bond_rust && ./bond_rust powf
node vms7_local.mjs

Los scripts completos se publican con el repositorio (próxima apertura pública); la fórmula, los parámetros y el protocolo están íntegramente en esta página — cualquiera puede reimplementarlos. Y el precio EN PRODUCCIÓN con un solo comando: /verify — steps 24195, el mismo receipt que la fila del edge de arriba.