@@ -54,9 +54,9 @@ impl<'a> VM<'a> {
5454 let af = self . to_f64_coerce ( a) . map_err ( |_| cold_type ( "% requires numeric operands" ) ) ?;
5555 let bf = self . to_f64_coerce ( b) . map_err ( |_| cold_type ( "% requires numeric operands" ) ) ?;
5656 if bf == 0.0 { return Err ( VmErr :: ZeroDiv ) ; }
57- let q = ( af / bf ) as i64 as f64 ;
58- let q_floor = q - if af / bf < 0.0 && q != af / bf { 1.0 } else { 0.0 } ;
59- return Ok ( Val :: float ( af - q_floor * bf ) ) ;
57+ // Use floor division semantics: result has the same sign as the divisor.
58+ let r = af - ( af / bf) . floor ( ) * bf ;
59+ return Ok ( Val :: float ( r ) ) ;
6060 }
6161 let ( Some ( ba) , Some ( bb) ) = ( self . to_bigint ( a) , self . to_bigint ( b) )
6262 else { return Err ( cold_type ( "% requires numeric operands" ) ) ; } ;
@@ -69,10 +69,8 @@ impl<'a> VM<'a> {
6969 let af = self . to_f64_coerce ( a) . map_err ( |_| cold_type ( "// requires numeric operands" ) ) ?;
7070 let bf = self . to_f64_coerce ( b) . map_err ( |_| cold_type ( "// requires numeric operands" ) ) ?;
7171 if bf == 0.0 { return Err ( VmErr :: ZeroDiv ) ; }
72- let q = af / bf;
73- let t = q as i64 as f64 ;
74- let floored = t - if q < 0.0 && t != q { 1.0 } else { 0.0 } ;
75- return Ok ( Val :: float ( floored) ) ;
72+ // floor() is correct for all magnitudes, including large floats where as-i64 would overflow.
73+ return Ok ( Val :: float ( ( af / bf) . floor ( ) ) ) ;
7674 }
7775 let ( Some ( ba) , Some ( bb) ) = ( self . to_bigint ( a) , self . to_bigint ( b) )
7876 else { return Err ( cold_type ( "// requires numeric operands" ) ) ; } ;
0 commit comments