DecFP: IEEE Decimal Floating-point in Julia
The DecFP package is a Julia wrapper around the Intel Decimal Floating-Point Math Library, providing a software implementation of the IEEE 754-2008 Decimal Floating-Point Arithmetic specification.
32-bit, 64-bit, and 128-bit decimal floating-point types
Dec128, respectively, are provided. This is very
different from packages such as
Decimals.jl, which provide
arbitrary-precision decimal types analogous to
precision types are very flexible, but fixed-precision types such
as those in DecFP are much faster (though still about 100x slower than
the hardware binary floating-point types
more memory-efficient (an array of
Dec64 values has exactly the
same memory footprint as an array of
The latest version of the DecFP package requires Julia 1.3 or later.
Dec64 and the other types mentioned above can be constructed from
other Julia numeric types (binary floating-point or integers) via
Dec(3), from strings by
parse(Dec64, "3.2") or
d64"3.2" (a Julia string macro); similarly for
The string macro
- Note: A decimal floating-point constant like
1.1in Julia refers to a
Float64(binary floating-point) value. So, for example,
Dec128(1.999999999999999999) == 2.0 ≠ d128"1.999999999999999999", since Julia first rounds
1.999999999999999999to the closest
2.0) before converting to
Dec128. If you need to specify an exact decimal constant, therefore, use one of the string-based constructors. If you use a string macro like
d128"1.999999999999999999", then the string parsing occurs before compilation and incurs no runtime cost.
Once a decimal float is constructed, most Julia arithmetic and
special functions should work without modification. For example,
d"3.2" * d"4.5" produces the (exact)
All basic arithmetic functions are supported, and many special functions
log, trigonometric functions, etc.). Mixed operations
involving decimal and binary floating-point or integer types are supported
(the result is promoted to decimal floating-point).
In general, you should be able to use the
DecFP types in any context
where you would have used binary floating-point types: arrays, complex
arithmetic, and linear algebra should all work, for the most part.