Sarek_df64Double-float value: hi + lo with |lo| <= ulp(hi)/2 when normalised.
val df64_type_id : df64 Sarek_ir_types.Type_id.tval df64_vector_type_id :
(df64, unit) Spoc_core.Vector.t Sarek_ir_types.Type_id.tval df64_make_custom : unit -> df64 Spoc_core.Vector.custom_typeval df64_custom : df64 Spoc_core.Vector.custom_typemodule df64_interp_helpers : sig ... enda * b, correctly rounded, and - unlike a *. b - not a multiply the backend can fuse into a later add or subtract.
Value-identical to a *. b on every input, with exactly one exception: an EXACTLY zero product (+0.0 *. -1.0 and friends) comes back +0.0 here rather than -0.0, because the fma adds +0.0. A nonzero product that UNDERFLOWS to zero keeps its sign under both forms - the fma rounds the exact product once, so the sign survives. Verified over the signed zeros, infinities, NaN, subnormals and 3e6 random float32 pairs: the exact-zero sign is the only divergence, and it is not observable at any df64 entry point, because the quick_two_sum that closes df64_mul/df64_mul_f32 adds +0.0 to it and yields +0.0 either way.
See the comment block above before changing this.
Knuth TwoSum: a + b as an exact hi + lo pair. Branch-free, 6 flops.
Dekker QuickTwoSum: exact hi + lo pair, 3 flops. Requires |a| >= |b| (or a = 0).
Split-free TwoProd via fma: a * b as an exact hi + lo pair, 3 flops.
Division (long division, 3 quotient digits), ~70 flops incl. 3 divides.
Square root (Karp/Newton correction step), ~10 flops + 1 sqrt. Domain: a >= 0; returns 0 for non-positive a.hi.
val df64_of_int32 : int32 -> df64Exact int32 -> df64 conversion via 16-bit limb split (int32 has up to 31 significant bits, float32 only 24; a df64 holds ~48).
module Host : sig ... end