From 178c30e6e446d6a0fcb3debfc6111007652e21a9 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Mon, 11 Aug 2008 23:55:32 +0000 Subject: [PATCH] fix lcm on 0 svn: r11194 --- collects/scribblings/reference/numbers.scrbl | 12 +++++++----- collects/tests/mzscheme/number.ss | 6 ++++++ src/mzscheme/src/number.c | 3 +++ 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/collects/scribblings/reference/numbers.scrbl b/collects/scribblings/reference/numbers.scrbl index 5f9942be36..f56265a553 100644 --- a/collects/scribblings/reference/numbers.scrbl +++ b/collects/scribblings/reference/numbers.scrbl @@ -291,15 +291,17 @@ otherwise.} @defproc[(gcd [n integer?] ...) integer?]{ Returns the - @as-index{greatest common divisor} of the @scheme[n]s. If no - arguments are provided, the result is @scheme[0]. + @as-index{greatest common divisor} (a non-negative number) of the + @scheme[n]s. If no arguments are provided, the result is + @scheme[0]. If all arguments are zero, the result is zero. @examples[(gcd 10) (gcd 12 81.0)]} -@defproc[(lcm [n integer?] ...) integer?]{ Returns the - @as-index{least common multiple} of the @scheme[n]s. If no arguments - are provided, the result is @scheme[1]. +@defproc[(lcm [n integer?] ...) integer?]{ Returns the @as-index{least + common multiple} (a non-negative number) of the @scheme[n]s. If no + arguments are provided, the result is @scheme[1]. If any argument is + zero, the result is zero. @examples[(lcm 10) (lcm 3 4.0)]} diff --git a/collects/tests/mzscheme/number.ss b/collects/tests/mzscheme/number.ss index e85a171d9a..2d63b3bd1d 100644 --- a/collects/tests/mzscheme/number.ss +++ b/collects/tests/mzscheme/number.ss @@ -1119,6 +1119,9 @@ (test 5.0 gcd 5.0 -10) (test 5.0 gcd 5.0) (test 5.0 gcd -5.0) +(test 3 gcd 0 0 3 0) +(test 3.0 gcd 0.0 0 3 0) +(test 0 gcd 0 0 0) (err/rt-test (gcd 5.0+0.0i 10)) (err/rt-test (gcd 5.0 10+0.0i)) (test (expt 3 37) gcd (expt 9 35) (expt 6 37)) @@ -1140,6 +1143,9 @@ (test 5 lcm 5) (test 5 lcm -5) (test 0 lcm 123 0) +(test 0 lcm 0 0) +(test 0.0 lcm 0 0.0) +(test 0.0 lcm 0.0 0) (test 30.0 lcm 5 6.0) (test 6.0 lcm 6.0) (test 6.0 lcm -6.0) diff --git a/src/mzscheme/src/number.c b/src/mzscheme/src/number.c index 0f1a4b1364..c7abf7c2b9 100644 --- a/src/mzscheme/src/number.c +++ b/src/mzscheme/src/number.c @@ -1086,6 +1086,9 @@ bin_lcm (Scheme_Object *n1, Scheme_Object *n2) Scheme_Object *d, *ret; d = scheme_bin_gcd(n1, n2); + + if (scheme_is_zero(d)) + return d; ret = scheme_bin_mult(n1, scheme_bin_quotient(n2, d));