TorchLean API

NN.Proofs.RuntimeApprox.IEEE32.Contracts

Binary32 observation and error contracts #

These interfaces connect TorchLean's binary32 observations to FloatLib's real semantics. Optional observations distinguish finite values from infinities and NaNs. ULP queries return the exponent of the spacing at a finite value, and each arithmetic error bound follows from FloatLib's rounding theorem with the original finiteness hypotheses.

theorem TorchLean.Floats.IEEE754.IEEE32Exec.toReal?_fma_eq_ite (x y z : FloatLib.Floats.ExecFloat.Binary 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) :
toReal? ((fun (left right addend : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.fma left right addend FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x y z) = if FloatLib.Floats.ExecFloat.Binary.isFinite ((fun (left right addend : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.fma left right addend FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x y z) = true then some (fp32Round ((FloatLib.Floats.ExecFloat.Binary.toModel x).toReal * (FloatLib.Floats.ExecFloat.Binary.toModel y).toReal + (FloatLib.Floats.ExecFloat.Binary.toModel z).toReal)) else none

Optional fused multiply-add result characterized by one real rounding.

theorem TorchLean.Floats.IEEE754.IEEE32Exec.toReal?_sqrt_eq_ite (x : FloatLib.Floats.ExecFloat.Binary 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) :
toReal? ((fun (value : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.sqrt value FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x) = if FloatLib.Floats.ExecFloat.Binary.isFinite ((fun (value : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.sqrt value FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x) = true then some (fp32Round (FloatLib.Floats.ExecFloat.Binary.toModel x).toReal) else none

Optional square-root result characterized by one real rounding.

Nearest-even binary32 rounding incurs at most half an ULP of absolute error.

theorem TorchLean.Floats.IEEE754.IEEE32Exec.toReal_fma_abs_error_of_isFinite (x y z : FloatLib.Floats.ExecFloat.Binary 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (hfin : FloatLib.Floats.ExecFloat.Binary.isFinite ((fun (left right addend : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.fma left right addend FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x y z) = true) :
|(FloatLib.Floats.ExecFloat.Binary.toModel ((fun (left right addend : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.fma left right addend FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x y z)).toReal - ((FloatLib.Floats.ExecFloat.Binary.toModel x).toReal * (FloatLib.Floats.ExecFloat.Binary.toModel y).toReal + (FloatLib.Floats.ExecFloat.Binary.toModel z).toReal)| eps32 ((FloatLib.Floats.ExecFloat.Binary.toModel x).toReal * (FloatLib.Floats.ExecFloat.Binary.toModel y).toReal + (FloatLib.Floats.ExecFloat.Binary.toModel z).toReal)

Half-ULP absolute error for a finite single-rounding fused multiply-add result.

theorem TorchLean.Floats.IEEE754.IEEE32Exec.toReal_sqrt_abs_error_of_isFinite (x : FloatLib.Floats.ExecFloat.Binary 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (hfin : FloatLib.Floats.ExecFloat.Binary.isFinite ((fun (value : FloatLib.Floats.ExecFloat (FloatLib.Floats.Formats.BinaryInterchange.Configured.Family (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (FloatLib.Floats.Formats.BinaryInterchange.Configured.Code (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) )) (FloatLib.Floats.Formats.BinaryInterchange.Configured.StoragePlan.forKnownWidth (FloatLib.Floats.ExecFloat.Binary.format 8 23 FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee (FloatLib.Floats.Formats.BinaryInterchange.FloatFormat.Encoding.ieee.defaultBias 8) toReal?._proof_1 toReal?._proof_2 toReal?._proof_3 toReal?._proof_4) (1 + 8 + 23) ))) => FloatLib.Floats.ExecFloat.Binary.sqrt value FloatLib.Floats.Formats.BinaryInterchange.Model.IEEERoundingMode.nearestEven) x) = true) :

Half-ULP absolute error for a finite square-root result.