IEEE32Exec per-op real error bounds (finite branch) #
NN.Floats.IEEEExec.BridgeFP32Total provides refinement theorems of the form
toReal (op_exec x y) = fp32Round (op_real (toReal x) (toReal y)),
valid when the executable result stays finite (no NaN/Inf).
This file turns those equalities into the standard half-ULP absolute error bounds you want in numerical proofs:
|toReal (op_exec x y) - op_real (toReal x) (toReal y)| ≤ eps₃₂ (op_real (toReal x) (toReal y)).
We intentionally do not provide bounds for sin/cos here: the current executable
implementation is deterministic (see NN.Floats.IEEEExec.Exec32), but it is an algorithmic
approximation rather than “real trig + one rounding step”, so its real-analytic error bounds live
in a separate trig-specific theory file.
Addition absolute error bound for IEEE32Exec on the finite branch.
Informal: if add x y stays finite then
|toReal(add x y) - (toReal x + toReal y)| ≤ eps₃₂(toReal x + toReal y).
Multiplication absolute error bound for IEEE32Exec on the finite branch.
Informal: if mul x y stays finite then
|toReal(mul x y) - (toReal x * toReal y)| ≤ eps₃₂(toReal x * toReal y).
Division absolute error bound for IEEE32Exec on the finite branch.
Informal: if div x y stays finite then
|toReal(div x y) - (toReal x / toReal y)| ≤ eps₃₂(toReal x / toReal y).
FMA absolute error bound for IEEE32Exec on the finite branch.
Informal: if fma x y z stays finite then
|toReal(fma x y z) - (toReal x * toReal y + toReal z)| ≤ eps₃₂(toReal x * toReal y + toReal z).
Square-root absolute error bound for IEEE32Exec on the finite branch.
Informal: if sqrt x stays finite then
|toReal(sqrt x) - Real.sqrt(toReal x)| ≤ eps₃₂(Real.sqrt(toReal x)).