Source code for claripy.fp

from __future__ import annotations

import decimal
from enum import Enum

from claripy.errors import ClaripyOperationError


[docs] class RM(Enum): """Rounding modes for floating point operations. See https://en.wikipedia.org/wiki/IEEE_754#Rounding_rules for more information. """ RM_NearestTiesEven = "RM_RNE" RM_NearestTiesAwayFromZero = "RM_RNA" RM_TowardsZero = "RM_RTZ" RM_TowardsPositiveInf = "RM_RTP" RM_TowardsNegativeInf = "RM_RTN"
[docs] @staticmethod def default(): return RM.RM_NearestTiesEven
[docs] def pydecimal_equivalent_rounding_mode(self): return { RM.RM_TowardsPositiveInf: decimal.ROUND_CEILING, RM.RM_TowardsNegativeInf: decimal.ROUND_FLOOR, RM.RM_TowardsZero: decimal.ROUND_DOWN, RM.RM_NearestTiesEven: decimal.ROUND_HALF_EVEN, RM.RM_NearestTiesAwayFromZero: decimal.ROUND_UP, }[self]
[docs] class FSort: """A class representing a floating point sort."""
[docs] def __init__(self, name, exp, mantissa): self.name = name self.exp = exp self.mantissa = mantissa
def __eq__(self, other): return self.exp == other.exp and self.mantissa == other.mantissa def __repr__(self): return self.name def __hash__(self): return hash((self.name, self.exp, self.mantissa)) @property def length(self): return self.exp + self.mantissa
[docs] @staticmethod def from_size(n): if n == 32: return FSORT_FLOAT if n == 64: return FSORT_DOUBLE raise ClaripyOperationError(f"{n} is not a valid FSort size")
[docs] @staticmethod def from_params(exp, mantissa): if exp == 8 and mantissa == 24: return FSORT_FLOAT if exp == 11 and mantissa == 53: return FSORT_DOUBLE raise ClaripyOperationError("unrecognized FSort params")
FSORT_FLOAT = FSort("FLOAT", 8, 24) FSORT_DOUBLE = FSort("DOUBLE", 11, 53)