Floating-point values #
The Lean type denoting a value of SMT sort (_ FloatingPoint exp sig): one of the five
distinguished constants, or the bit pattern itself.
exp and sig follow SMT-LIB, not IEEE-754 field widths. sig counts the significand's
bits including the hidden leading one, so the stored pattern is one sign bit, exp exponent bits
and sig - 1 stored significand bits — exp + sig in total, not 1 + exp + sig. Single precision
is Float 8 24 and its pattern is 32 bits wide.
Converting a float to a term and back is done by Cvc.Untyped.Theory.Float and
Cvc.Typed.Theory.Float.
A floating-point value of exponent width exp and significand width sig.
- posInf
{exp sig : Nat}
: Float exp sig
Positive infinity.
- negInf
{exp sig : Nat}
: Float exp sig
Negative infinity.
- nan
{exp sig : Nat}
: Float exp sig
Not-a-number.
- posZero
{exp sig : Nat}
: Float exp sig
Positive zero.
- negZero
{exp sig : Nat}
: Float exp sig
Negative zero.
- ofBitVec {exp sig : Nat} (bv : BitVec (exp + sig)) : Float exp sig
Instances For
Equations
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posInf Cvc.Float.posInf = isTrue ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posInf Cvc.Float.negInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posInf Cvc.Float.nan = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posInf Cvc.Float.posZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posInf Cvc.Float.negZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posInf (Cvc.Float.ofBitVec bv) = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negInf Cvc.Float.posInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negInf Cvc.Float.negInf = isTrue ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negInf Cvc.Float.nan = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negInf Cvc.Float.posZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negInf Cvc.Float.negZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negInf (Cvc.Float.ofBitVec bv) = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.nan Cvc.Float.posInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.nan Cvc.Float.negInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.nan Cvc.Float.nan = isTrue ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.nan Cvc.Float.posZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.nan Cvc.Float.negZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.nan (Cvc.Float.ofBitVec bv) = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posZero Cvc.Float.posInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posZero Cvc.Float.negInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posZero Cvc.Float.nan = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posZero Cvc.Float.posZero = isTrue ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posZero Cvc.Float.negZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.posZero (Cvc.Float.ofBitVec bv) = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negZero Cvc.Float.posInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negZero Cvc.Float.negInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negZero Cvc.Float.nan = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negZero Cvc.Float.posZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negZero Cvc.Float.negZero = isTrue ⋯
- Cvc.instDecidableEqFloat.decEq Cvc.Float.negZero (Cvc.Float.ofBitVec bv) = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq (Cvc.Float.ofBitVec bv) Cvc.Float.posInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq (Cvc.Float.ofBitVec bv) Cvc.Float.negInf = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq (Cvc.Float.ofBitVec bv) Cvc.Float.nan = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq (Cvc.Float.ofBitVec bv) Cvc.Float.posZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq (Cvc.Float.ofBitVec bv) Cvc.Float.negZero = isFalse ⋯
- Cvc.instDecidableEqFloat.decEq (Cvc.Float.ofBitVec a) (Cvc.Float.ofBitVec b) = if h : a = b then h ▸ isTrue ⋯ else isFalse ⋯
Instances For
Equations
Equations
- Cvc.instHashableFloat.hash Cvc.Float.posInf = 0
- Cvc.instHashableFloat.hash Cvc.Float.negInf = 1
- Cvc.instHashableFloat.hash Cvc.Float.nan = 2
- Cvc.instHashableFloat.hash Cvc.Float.posZero = 3
- Cvc.instHashableFloat.hash Cvc.Float.negZero = 4
- Cvc.instHashableFloat.hash (Cvc.Float.ofBitVec a) = mixHash 5 (hash a)
Instances For
Equations
- Cvc.instOrdFloat = { compare := Cvc.instOrdFloat.ord }
Equations
- Cvc.instOrdFloat.ord Cvc.Float.posInf Cvc.Float.posInf = Ordering.eq
- Cvc.instOrdFloat.ord Cvc.Float.posInf x✝ = Ordering.lt
- Cvc.instOrdFloat.ord x✝ Cvc.Float.posInf = Ordering.gt
- Cvc.instOrdFloat.ord Cvc.Float.negInf Cvc.Float.negInf = Ordering.eq
- Cvc.instOrdFloat.ord Cvc.Float.negInf x✝ = Ordering.lt
- Cvc.instOrdFloat.ord x✝ Cvc.Float.negInf = Ordering.gt
- Cvc.instOrdFloat.ord Cvc.Float.nan Cvc.Float.nan = Ordering.eq
- Cvc.instOrdFloat.ord Cvc.Float.nan x✝ = Ordering.lt
- Cvc.instOrdFloat.ord x✝ Cvc.Float.nan = Ordering.gt
- Cvc.instOrdFloat.ord Cvc.Float.posZero Cvc.Float.posZero = Ordering.eq
- Cvc.instOrdFloat.ord Cvc.Float.posZero x✝ = Ordering.lt
- Cvc.instOrdFloat.ord x✝ Cvc.Float.posZero = Ordering.gt
- Cvc.instOrdFloat.ord Cvc.Float.negZero Cvc.Float.negZero = Ordering.eq
- Cvc.instOrdFloat.ord Cvc.Float.negZero x✝ = Ordering.lt
- Cvc.instOrdFloat.ord x✝ Cvc.Float.negZero = Ordering.gt
- Cvc.instOrdFloat.ord (Cvc.Float.ofBitVec a) (Cvc.Float.ofBitVec b) = (compare a b).then Ordering.eq
Instances For
Bit-pattern representation of a floating point, exp + sig bits wide.
Equations
- Cvc.BitVec.toFloat exp sig bv = Cvc.Float.ofBitVec bv
Instances For
Equations
- Cvc.Float.instToTyp = { typ := Cvc.Typ.float exp sig }
String representation.
Equations
- Cvc.Float.posInf.toString = toString "Float[" ++ toString exp ++ toString ", " ++ toString sig ++ toString ", " ++ toString "+∞" ++ toString "]"
- Cvc.Float.negInf.toString = toString "Float[" ++ toString exp ++ toString ", " ++ toString sig ++ toString ", " ++ toString "-∞" ++ toString "]"
- Cvc.Float.nan.toString = toString "Float[" ++ toString exp ++ toString ", " ++ toString sig ++ toString ", " ++ toString "NaN" ++ toString "]"
- Cvc.Float.posZero.toString = toString "Float[" ++ toString exp ++ toString ", " ++ toString sig ++ toString ", " ++ toString "+0" ++ toString "]"
- Cvc.Float.negZero.toString = toString "Float[" ++ toString exp ++ toString ", " ++ toString sig ++ toString ", " ++ toString "-0" ++ toString "]"
- (Cvc.Float.ofBitVec a).toString = toString "Float[" ++ toString exp ++ toString ", " ++ toString sig ++ toString ", " ++ toString (toString a) ++ toString "]"
Instances For
Equations
- Cvc.Float.instToString = { toString := Cvc.Float.toString }
Equations
- Cvc.Float.Erased.instToString = { toString := Cvc.Float.Erased.toString }