detect float rounding overflows (#1365)
This commit is contained in:
@@ -375,7 +375,18 @@ impl<'a, TermMarker: Allocator> ArithmeticEvaluator<'a, TermMarker> {
|
|||||||
pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number {
|
pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number {
|
||||||
match n {
|
match n {
|
||||||
&Number::Integer(_) | &Number::Fixnum(_) => *n,
|
&Number::Integer(_) | &Number::Fixnum(_) => *n,
|
||||||
&Number::Float(OrderedFloat(f)) => fixnum!(Number, f.floor() as i64, arena),
|
&Number::Float(OrderedFloat(f)) => {
|
||||||
|
let f = f.floor();
|
||||||
|
|
||||||
|
const I64_MIN_TO_F: OrderedFloat<f64> = OrderedFloat(i64::MIN as f64);
|
||||||
|
const I64_MAX_TO_F: OrderedFloat<f64> = OrderedFloat(i64::MIN as f64);
|
||||||
|
|
||||||
|
if I64_MIN_TO_F <= OrderedFloat(f) && OrderedFloat(f) <= I64_MAX_TO_F {
|
||||||
|
fixnum!(Number, f as i64, arena)
|
||||||
|
} else {
|
||||||
|
Number::Integer(arena_alloc!(Integer::from_f64(f).unwrap(), arena))
|
||||||
|
}
|
||||||
|
}
|
||||||
&Number::Rational(ref r) => {
|
&Number::Rational(ref r) => {
|
||||||
let r_ref = r.fract_floor_ref();
|
let r_ref = r.fract_floor_ref();
|
||||||
let (mut fract, mut floor) = (Rational::new(), Integer::new());
|
let (mut fract, mut floor) = (Rational::new(), Integer::new());
|
||||||
|
|||||||
@@ -116,7 +116,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> {
|
|||||||
let mut parent_spec = DirectedOp::Left(atom!("-"), OpDesc::build_with(200, FY as u8));
|
let mut parent_spec = DirectedOp::Left(atom!("-"), OpDesc::build_with(200, FY as u8));
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
// match self.machine_st.store(self.machine_st.deref(addr)) {
|
|
||||||
read_heap_cell!(self.heap[h],
|
read_heap_cell!(self.heap[h],
|
||||||
(HeapCellValueTag::Str, s) => {
|
(HeapCellValueTag::Str, s) => {
|
||||||
read_heap_cell!(self.heap[s],
|
read_heap_cell!(self.heap[s],
|
||||||
@@ -156,7 +155,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> {
|
|||||||
None => return false,
|
None => return false,
|
||||||
};
|
};
|
||||||
|
|
||||||
// let addr = self.machine_st.store(self.machine_st.deref(addr));
|
|
||||||
property_check(addr)
|
property_check(addr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user