# Numbers and Math

As of version 1.3, Clojure provides full support for JVM primitive values, making it possible to write high performance, idiomatic Clojure code for numeric applications.

#### Numeric Types

• Primitives - These are raw JVM primitives, not object references. They are by far the fastest way to do math on the JVM. Clojure provides support for the full set of JVM primitives internally, but
• Boxed Numbers - These are full objects that extend the java.lang.Number class. Clojure uses the full set of types built into the JVM (Integer, Long, BigInteger, Float, Double, BigDecimal) as well as two additional types:
• clojure.lang.Ratio, for expressing rational numbers that cannot be expressed as a decimal without truncation
• clojure.lang.BigInt, which is similar to Java's java.math.BigInteger in allowing integer sizes exceeding 64 bits, but provides better performance by delegating to native operations when small enough.

#### Literals

It is possible to create most types of numbers as literals directly within Clojure code:

Type

Literal Syntax

Examples

primitive long (decimal)

a number, with no leading zeroes

42

primitive long (octal)

a number with a leading zero

052

a number prefixed by 0x

0x2A

primitive long (arbitrary base)

base + r + the number

2r101010, 12r36

primitive double (standard notation)

a number containing a decimal point

98.8, 3.3

primitive double (scientific notation)

coefficient + E + sign (optional) + exponent

6.0221479E+23, 6.67428E-11

rational number

number including a slash, with no spaces

1/3, 33/16

fixed point decimal (java.lang.BigDecimal)

number with M suffix

9.99M

big integer (clojure.lang.BigInt)

number with N suffix, or a number too large to fit in a long

42N, 42000000000000000000

#### Math Operations

TODO: Documentation of math operations, contagion & overflow

#### Hinting, casting and coercions

TODO: Documentation of autoboxing, type hints on functions, coercion/casting functions

TODO: