From 001ad13297423d3f47bf3cd9a886f9e9f8ff0ff2 Mon Sep 17 00:00:00 2001 From: David Van Horn Date: Wed, 30 Dec 2020 07:09:14 -0500 Subject: [PATCH] Check numeric argument to `real->decimal-string` Closes #3565 --- pkgs/racket-doc/scribblings/reference/numbers.scrbl | 8 +++++++- racket/collects/racket/private/string.rkt | 3 +++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pkgs/racket-doc/scribblings/reference/numbers.scrbl b/pkgs/racket-doc/scribblings/reference/numbers.scrbl index 4fb6932629..ba2cb2eb1a 100644 --- a/pkgs/racket-doc/scribblings/reference/numbers.scrbl +++ b/pkgs/racket-doc/scribblings/reference/numbers.scrbl @@ -1132,7 +1132,7 @@ that the @racket[read-single-flonum] parameter affects @racket[read]. #:changed "7.3.0.5" @elem{Added the @racket[single-mode] argument.}]} -@defproc[(real->decimal-string [n real?] [decimal-digits exact-nonnegative-integer? 2]) +@defproc[(real->decimal-string [n rational?] [decimal-digits exact-nonnegative-integer? 2]) string?]{ Prints @racket[n] into a string and returns the string. The printed @@ -1147,6 +1147,12 @@ process is an exact number whose decimal representation has no more than @racket[decimal-digits] digits after the decimal (and it is padded with trailing zeros if necessary). +If @racket[n] is a real number with no decimal representation (e.g. +@racket[+nan.0], @racket[+inf.0]), then the @exnraise[exn:fail:contract]. +(Any real number that is convertible to decimal notation is rational, +so @racket[n] must be @racket[rational?], despite the name of the +function.) + @mz-examples[ #:eval math-eval (real->decimal-string pi) diff --git a/racket/collects/racket/private/string.rkt b/racket/collects/racket/private/string.rkt index c6263194fe..acb167f296 100644 --- a/racket/collects/racket/private/string.rkt +++ b/racket/collects/racket/private/string.rkt @@ -15,6 +15,9 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define (real->decimal-string n [digits 2]) + (unless (rational? n) + (raise-argument-error 'real->decimal-string "rational?" + n)) (unless (exact-nonnegative-integer? digits) (raise-argument-error 'real->decimal-string "exact-nonnegative-integer?" digits))