# 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 machine’s 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.