Lean4
@[nolint docBlame]
unsafe def mul (mode : RMode) : Float → Float → Float
| nan, _ => nan
| _, nan => nan
| inf s₁, f₂ => if f₂.isZero then nan else inf (xor s₁ f₂.sign)
| f₁, inf s₂ => if f₁.isZero then nan else inf (xor f₁.sign s₂)
| finite s₁ e₁ m₁ v₁, finite s₂ e₂ m₂ v₂ =>
let f₁ := finite s₁ e₁ m₁ v₁
let f₂ := finite s₂ e₂ m₂ v₂
ofRat mode (toRat f₁ rfl * toRat f₂ rfl)