Skip to content

Commit

Permalink
Merge pull request #524 from yorickhardy/master
Browse files Browse the repository at this point in the history
Implement r7rs round to even behaviour for half integers
  • Loading branch information
justinethier authored Feb 3, 2024
2 parents 3b921e7 + 4bbceeb commit 5ea2fae
Show file tree
Hide file tree
Showing 4 changed files with 11 additions and 2 deletions.
1 change: 1 addition & 0 deletions include/cyclone/runtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
5 changes: 5 additions & 0 deletions runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions scheme/base.sld
Original file line number Diff line number Diff line change
Expand Up @@ -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); "
Expand Down
3 changes: 3 additions & 0 deletions tests/base.scm
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,9 @@
(test 4.0 (ceiling 3.5))
(test 3.0 (truncate 3.5))
(test 4.0 (round 3.5))
(test 2.0 (round 2.5))
(test -4.0 (round -3.5))
(test -2.0 (round -2.5))
(test 4.0 (round 7/2)) ;; Rationals not supported, so result is inexact
(test 7 (round 7))

Expand Down

0 comments on commit 5ea2fae

Please sign in to comment.