You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/quad/qtest/mds/numbers.md

170 lines
5.8 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Numbers
A Racket _number_ is either exact or inexact:
* An _exact_ number is either
* an arbitrarily large or small integer, such as `5`,
`99999999999999999`, or `-17`;
* a rational that is exactly the ratio of two arbitrarily small or
large integers, such as `1/2`, `99999999999999999/2`, or `-3/4`; or
* a complex number with exact real and imaginary parts \(where the
imaginary part is not zero\), such as `1+2i` or `1/2+3/4i`.
* An _inexact_ number is either
* an IEEE floating-point representation of a number, such as `2.0` or
`3.14e+87`, where the IEEE infinities and not-a-number are written
`+inf.0`, `-inf.0`, and `+nan.0` \(or `-nan.0`\); or
* a complex number with real and imaginary parts that are IEEE
floating-point representations, such as `2.0+3.0i` or
`-inf.0+nan.0i`; as a special case, an inexact complex number can
have an exact zero real part with an inexact imaginary part.
Inexact numbers print with a decimal point or exponent specifier, and
exact numbers print as integers and fractions. The same conventions
apply for reading number constants, but `#e` or `#i` can prefix a number
to force its parsing as an exact or inexact number. The prefixes `#b`,
`#o`, and `#x` specify binary, octal, and hexadecimal interpretation of
digits.
> +\[missing\] in \[missing\] documents the fine points of the syntax of
> numbers.
Examples:
```racket
> 0.5
0.5
> #e0.5
1/2
> #x03BB
955
```
Computations that involve an inexact number produce inexact results, so
that inexactness acts as a kind of taint on numbers. Beware, however,
that Racket offers no “inexact booleans,” so computations that branch on
the comparison of inexact numbers can nevertheless produce exact
results. The procedures `exact->inexact` and `inexact->exact` convert
between the two types of numbers.
Examples:
```racket
> (/ 1 2)
1/2
> (/ 1 2.0)
0.5
> (if (= 3.0 2.999) 1 2)
2
> (inexact->exact 0.1)
3602879701896397/36028797018963968
```
Inexact results are also produced by procedures such as `sqrt`, `log`,
and `sin` when an exact result would require representing real numbers
that are not rational. Racket can represent only rational numbers and
complex numbers with rational parts.
Examples:
```racket
> (sin 0) ; rational...
0
> (sin 1/2) ; not rational...
0.479425538604203
```
In terms of performance, computations with small integers are typically
the fastest, where “small” means that the number fits into one bit less
than the machines word-sized representation for signed numbers.
Computation with very large exact integers or with non-integer exact
numbers can be much more expensive than computation with inexact
numbers.
```racket
(define (sigma f a b)
(if (= a b)
0
(+ (f a) (sigma f (+ a 1) b))))
```
```racket
> (time (round (sigma (lambda (x) (/ 1 x)) 1 2000)))
cpu time: 80 real time: 80 gc time: 17
8
> (time (round (sigma (lambda (x) (/ 1.0 x)) 1 2000)))
cpu time: 1 real time: 1 gc time: 0
8.0
```
The number categories _integer_, _rational_, _real_ \(always rational\),
and _complex_ are defined in the usual way, and are recognized by the
procedures `integer?`, `rational?`, `real?`, and `complex?`, in addition
to the generic `number?`. A few mathematical procedures accept only real
numbers, but most implement standard extensions to complex numbers.
Examples:
```racket
> (integer? 5)
#t
> (complex? 5)
#t
> (integer? 5.0)
#t
> (integer? 1+2i)
#f
> (complex? 1+2i)
#t
> (complex? 1.0+2.0i)
#t
> (abs -5)
5
> (abs -5+2i)
abs: contract violation
expected: real?
given: -5+2i
> (sin -5+2i)
3.6076607742131563+1.0288031496599337i
```
The `=` procedure compares numbers for numerical equality. If it is
given both inexact and exact numbers to compare, it essentially converts
the inexact numbers to exact before comparing. The `eqv?` \(and
therefore `equal?`\) procedure, in contrast, compares numbers
considering both exactness and numerical equality.
Examples:
```racket
> (= 1 1.0)
#t
> (eqv? 1 1.0)
#f
```
Beware of comparisons involving inexact numbers, which by their nature
can have surprising behavior. Even apparently simple inexact numbers may
not mean what you think they mean; for example, while a base-2 IEEE
floating-point number can represent `1/2` exactly, it can only
approximate `1/10`:
Examples:
```racket
> (= 1/2 0.5)
#t
> (= 1/10 0.1)
#f
> (inexact->exact 0.1)
3602879701896397/36028797018963968
```
> +\[missing\] in \[missing\] provides more on numbers and number
> procedures.