From: Mark Thom Date: Thu, 24 Mar 2022 16:25:42 +0000 (-0600) Subject: detect float rounding overflows (#1365) X-Git-Tag: v0.9.1~98 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=1f21a5fe62c8a2b2eb9feb3a807d9f1abffe4085;p=scryer-prolog.git detect float rounding overflows (#1365) --- diff --git a/src/arithmetic.rs b/src/arithmetic.rs index 894e9d1f..cc0b0194 100644 --- a/src/arithmetic.rs +++ b/src/arithmetic.rs @@ -375,7 +375,18 @@ impl<'a, TermMarker: Allocator> ArithmeticEvaluator<'a, TermMarker> { pub(crate) fn rnd_i<'a>(n: &'a Number, arena: &mut Arena) -> Number { match 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 = OrderedFloat(i64::MIN as f64); + const I64_MAX_TO_F: OrderedFloat = 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) => { let r_ref = r.fract_floor_ref(); let (mut fract, mut floor) = (Rational::new(), Integer::new()); diff --git a/src/heap_print.rs b/src/heap_print.rs index 8ee3ec67..030e7c73 100644 --- a/src/heap_print.rs +++ b/src/heap_print.rs @@ -116,7 +116,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> { let mut parent_spec = DirectedOp::Left(atom!("-"), OpDesc::build_with(200, FY as u8)); loop { - // match self.machine_st.store(self.machine_st.deref(addr)) { read_heap_cell!(self.heap[h], (HeapCellValueTag::Str, s) => { read_heap_cell!(self.heap[s], @@ -156,7 +155,6 @@ impl<'a> StackfulPreOrderHeapIter<'a> { None => return false, }; - // let addr = self.machine_st.store(self.machine_st.deref(addr)); property_check(addr) } }