# Cookbook/Numbers

Numbers in Haskell can be of the type `Int, Integer, Float, Double, or Rational`.

## Rounding numbers

Problem Solution Examples
rounding a given number round
```round 3.4      --> 3
round 3.5      --> 4
round 2.5      --> 2
```
finding the nearest integer greater than or equal to a given number ceiling
```ceiling 3.0    --> 3
ceiling 3.1    --> 4
```
finding the nearest integer less than or equal to a given number floor
```floor 3.0      --> 3
floor 3.9      --> 3
```
finding the nearest integer between zero and a given number truncate
```truncate 3.0           -->  3
truncate 3.9           -->  3
truncate (negate 3.0)  --> -3
truncate (negate 3.9)  --> -3
```

## Taking logarithms

```log 2.718281828459045  --> 1.0
logBase 10 10000       --> 4.0
```

## Generating random numbers

```import System.Random

main = do
gen <- getStdGen
let ns = randoms gen :: [Int]
print \$ take 10 ns
```

## Binary representation of numbers

```import Data.Bits

-- Extract a range of bits, most-significant first
bitRange :: Bits a => a -> Int -> Int -> [Bool]
bitRange n lo hi = reverse . map (testBit n) [lo..hi]

-- Extract all bits, most-significant first
bits :: Bits a => a -> [Bool]
bits n = bitRange n 0 (bitSize n - 1)

-- Display a number in binary, including leading zeroes.
-- c.f. Numeric.showHex
showBits :: Bits a => a -> ShowS
showBits = showString . map (\b -> if b then '1' else '0') . bits
```

## Using complex numbers

Problem Solution Examples
creating a complex number from real and imaginary rectangular components (:+)
```import Data.Complex
1.0 :+ 0.0        --> 1.0 :+ 0.0
```
creating a complex number from polar components mkPolar
```import Data.Complex
mkPolar 1.0 pi    --> (-1.0) :+ 1.2246063538223773e-16
```
```import Data.Complex