diff --git a/include/cyclone/runtime.h b/include/cyclone/runtime.h index 82608b30..432be667 100644 --- a/include/cyclone/runtime.h +++ b/include/cyclone/runtime.h @@ -504,6 +504,7 @@ int Cyc_have_mstreams(); } \ return_closcall1(data, cont, &d) +double round_to_nearest_even(double); void Cyc_exact(void *data, object cont, object z); object Cyc_exact_no_cps(void *data, object ptr, object z); diff --git a/runtime.c b/runtime.c index 3448cecb..59143b47 100644 --- a/runtime.c +++ b/runtime.c @@ -8765,6 +8765,11 @@ int num2ratio(double x, double *numerator, double *denominator) return 0; } +double round_to_nearest_even(double x) +{ + return x-remainder(x,1.0); +} + /** * Receive a Scheme number and pass requested portion of a rational number to * the continuation `cont`. Pass numerator if `numerator` is true, else the diff --git a/scheme/base.sld b/scheme/base.sld index 669b8cde..ae585953 100644 --- a/scheme/base.sld +++ b/scheme/base.sld @@ -1372,9 +1372,9 @@ " return_double_op_no_cps(data, ptr, trunc, z);") (define-c round "(void *data, int argc, closure _, object k, object z)" - " return_double_op(data, k, round, z); " + " return_double_op(data, k, round_to_nearest_even, z); " "(void *data, object ptr, object z)" - " return_double_op_no_cps(data, ptr, round, z);") + " return_double_op_no_cps(data, ptr, round_to_nearest_even, z);") (define-c exact "(void *data, int argc, closure _, object k, object z)" " Cyc_exact(data, k, z); "