2.5 KiB
layout | title | category | tags | order | |||
---|---|---|---|---|---|---|---|
developer-doc | Numbers | semantics |
|
8 |
Numbers
In order to enhance the user experience, Enso provides a number hierarchy, encompassing both integers of unbound size and floating-point decimals.
Number Types
The base number type in Enso is Number
. It includes both integers and
floating-point numbers and is the basic type that should be used whenever
numerical computations are performed. Any method defined on the type Number
is
automatically available on all types of numeric values.
The hierarchy is further split into the Integer
and Decimal
types. Integer
is capable of representing values of unbound length. Decimal
is capable of
representing IEEE 64-bit (double precision) floating numbers.
Any method defined on Integer
is available for all integers, while any method
defined on Decimal
is available on all floating-point numbers. Methods defined
on Integer
or Decimal
take precedence over methods defined on Number
, when
name resolution is performed.
Internal Representation
Integers that can be represented in a 64-bit integer type are represented as
such. When a 64-bit representation would overflow (either by the result of
creating a large number literal or an arithmetic operation), it is represented
in a Java BigInteger
type, thus becoming significantly slower than the 64-bit
representation.
Decimals are represented using the Java double
type.
Type Conversions
Number literals that do not contain a decimal point, are treated as integers. Other literals are interpreted as decimals (even if the fractional part is 0).
Any arithmetic operation where at least one of the operands is a decimal will result in a decimal result.
Moreover, the default division operator /
is implemented as floating-point
division and always returns a decimal. If the desired behavior is integral
division instead, the Integer.div
method implements it.
Another operator worth noting is the exponentiation operator (^
). It will
always result in a decimal whenever either operand is decimal or the exponent is
negative. It will also return a float result when the exponent is outside the
64-bit integer range.
There is a Number.to_decimal
method, that allows converting any number to a
decimal. This is useful in certain high-performance and polyglot applications.