From 4ccbd7fcadd418ace52dcffafdefc9074cb3ca7d Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 17 Jan 2019 16:49:16 -0700 Subject: [PATCH] doc: fill gaps in spec for `expt` There's no good answer for `expt` in the vicinity of `(expt 0 0)`, and I went in circles trying to redecide how things should work. Given that RnRS defines `(expt 0 0)` to be 1, though, the status quo seems as good as anything. --- .../scribblings/reference/numbers.scrbl | 54 ++++++++++++------- .../racket-test-core/tests/racket/number.rktl | 1 + 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/pkgs/racket-doc/scribblings/reference/numbers.scrbl b/pkgs/racket-doc/scribblings/reference/numbers.scrbl index bf1acead2b..da57ae4ced 100644 --- a/pkgs/racket-doc/scribblings/reference/numbers.scrbl +++ b/pkgs/racket-doc/scribblings/reference/numbers.scrbl @@ -549,16 +549,30 @@ Returns @racket[z] raised to the power of @racket[w]. If @racket[w] is exact @racket[0], the result is exact @racket[1]. - If @racket[w] is @racket[0.0] or @racket[-0.0] and @racket[z] is a @tech{real number}, the + If @racket[w] is @racket[0.0] or @racket[-0.0] and @racket[z] is a @tech{real number} + other than exact @racket[1] or @racket[0], the result is @racket[1.0] (even if @racket[z] is @racket[+nan.0]). If @racket[z] is exact @racket[1], the result is exact @racket[1]. If @racket[z] is @racket[1.0] and @racket[w] is a @tech{real number}, the result is @racket[1.0] (even if @racket[w] is @racket[+nan.0]). -If @racket[z] is - exact @racket[0] and @racket[w] is negative, the - @exnraise[exn:fail:contract:divide-by-zero]. +If @racket[z] is exact @racket[0], the result is as follows: +@; +@itemlist[#:style 'compact + + @item{@racket[w] is exact @racket[0] --- result is @racket[1]} + + @item{@racket[w] is @racket[0.0] or @racket[-0.0] --- result is @racket[1.0]} + + @item{real part of @racket[w] is negative --- the @exnraise[exn:fail:contract:divide-by-zero]} + + @item{@racket[w] is nonreal with a nonpositive real part --- the @exnraise[exn:fail:contract:divide-by-zero]} + + @item{@racket[w] is @racket[+nan.0] --- result is @racket[+nan.0]} + + @item{otherwise --- result is @racket[0]} +] Further special cases when @racket[w] is a @tech{real number}: @margin-note*{These special cases correspond to @tt{pow} in C99 @cite["C99"], @@ -569,45 +583,45 @@ integer.} @item{@racket[(expt 0.0 w)]: @itemlist[#:style 'compact - @item{@racket[w] is negative --- @racket[+inf.0]} - @item{@racket[w] is positive --- @racket[0.0]}]} + @item{@racket[w] is negative --- result is @racket[+inf.0]} + @item{@racket[w] is positive --- result is @racket[0.0]}]} @item{@racket[(expt -0.0 w)]: @itemlist[#:style 'compact @item{@racket[w] is negative: @itemlist[#:style 'compact - @item{@racket[w] is an odd integer --- @racket[-inf.0]} - @item{@racket[w] otherwise rational --- @racket[+inf.0]}]} + @item{@racket[w] is an odd integer --- result is @racket[-inf.0]} + @item{@racket[w] otherwise rational --- result is @racket[+inf.0]}]} @item{@racket[w] is positive: @itemlist[#:style 'compact - @item{@racket[w] is an odd integer --- @racket[-0.0]} - @item{@racket[w] otherwise rational --- @racket[+0.0]}]}]} + @item{@racket[w] is an odd integer --- result is @racket[-0.0]} + @item{@racket[w] otherwise rational --- result is @racket[+0.0]}]}]} @item{@racket[(expt z -inf.0)] for positive @racket[z]: @itemlist[#:style 'compact - @item{@racket[z] is less than @racket[1.0] --- @racket[+inf.0]} - @item{@racket[z] is greater than @racket[1.0] --- @racket[+0.0]}]} + @item{@racket[z] is less than @racket[1.0] --- result is @racket[+inf.0]} + @item{@racket[z] is greater than @racket[1.0] --- result is @racket[+0.0]}]} @item{@racket[(expt z +inf.0)] for positive @racket[z]: @itemlist[#:style 'compact - @item{@racket[z] is less than @racket[1.0] --- @racket[+0.0]} - @item{@racket[z] is greater than @racket[1.0] --- @racket[+inf.0]}]} + @item{@racket[z] is less than @racket[1.0] --- result is @racket[+0.0]} + @item{@racket[z] is greater than @racket[1.0] --- result is @racket[+inf.0]}]} @item{@racket[(expt -inf.0 w)] for integer @racket[w]: @itemlist[#:style 'compact @item{@racket[w] is negative: @itemlist[#:style 'compact - @item{@racket[w] is odd --- @racket[-0.0]} - @item{@racket[w] is even --- @racket[+0.0]}]} + @item{@racket[w] is odd --- result is @racket[-0.0]} + @item{@racket[w] is even --- result is @racket[+0.0]}]} @item{@racket[w] is positive: @itemlist[#:style 'compact - @item{@racket[w] is odd --- @racket[-inf.0]} - @item{@racket[w] is even --- @racket[+inf.0]}]}]} + @item{@racket[w] is odd --- result is @racket[-inf.0]} + @item{@racket[w] is even --- result is @racket[+inf.0]}]}]} @item{@racket[(expt +inf.0 w)]: @itemlist[#:style 'compact - @item{@racket[w] is negative --- @racket[+0.0]} - @item{@racket[w] is positive --- @racket[+inf.0]}]} + @item{@racket[w] is negative --- result is @racket[+0.0]} + @item{@racket[w] is positive --- result is @racket[+inf.0]}]} ] @mz-examples[(expt 2 3) (expt 4 0.5) (expt +inf.0 0)]} diff --git a/pkgs/racket-test-core/tests/racket/number.rktl b/pkgs/racket-test-core/tests/racket/number.rktl index be9bf5357a..79d61e9bdc 100644 --- a/pkgs/racket-test-core/tests/racket/number.rktl +++ b/pkgs/racket-test-core/tests/racket/number.rktl @@ -1912,6 +1912,7 @@ (err/rt-test (expt 0 0.0+2i) exn:fail:contract:divide-by-zero?) (err/rt-test (expt 0 -0.0+2i) exn:fail:contract:divide-by-zero?) (err/rt-test (expt 0 0+0.0i) exn:fail:contract:divide-by-zero?) +(err/rt-test (expt 0 +nan.0+1.0i) exn:fail:contract:divide-by-zero?) (err/rt-test (expt 'a 0)) (err/rt-test (expt 'a 1))