GitHub - JuliaIntervals/CoreMath.jl: Julia wrappers for core-math correctly-rounded IEEE 754 math functions

CoreMath.jl

Julia wrappers for the core-math library, which provides correctly-rounded IEEE 754 math functions.

Unlike Base math functions (which are faithfully rounded, i.e. off by at most 1 ULP), CoreMath guarantees that every result is the nearest representable floating-point number to the exact mathematical value.

Installation

using Pkg
Pkg.add("CoreMath")

Usage

All functions use the cr_ prefix to distinguish them from Base equivalents:

using CoreMath

# Float64
cr_sin(1.0)          # 0.8414709848078965
cr_exp(1.0)          # 2.718281828459045
cr_log(2.0)          # 0.6931471805599453
cr_cbrt(27.0)        # 3.0

# Float32 — same function names, dispatch on type
cr_sin(1.0f0)        # 0.84147096f0
cr_exp(1.0f0)        # 2.7182817f0

# Float16 (Linux only)
cr_sin(Float16(1.0)) # Float16(0.8413)
cr_exp(Float16(1.0)) # Float16(2.719)

Bivariate functions

cr_pow(2.0, 10.0)    # 1024.0
cr_hypot(3.0, 4.0)   # 5.0
cr_atan2(1.0, 1.0)   # 0.7853981633974483

sincos

s, c = cr_sincos(1.0)  # (0.8414709848078965, 0.5403023058681398)

Available functions

Trigonometric: cr_sin, cr_cos, cr_tan, cr_asin, cr_acos, cr_atan

Pi-scaled trigonometric: cr_sinpi, cr_cospi, cr_tanpi, cr_asinpi, cr_acospi, cr_atanpi

Hyperbolic: cr_sinh, cr_cosh, cr_tanh, cr_asinh, cr_acosh, cr_atanh

Exponential: cr_exp, cr_exp2, cr_exp10, cr_expm1, cr_exp2m1, cr_exp10m1

Logarithmic: cr_log, cr_log2, cr_log10, cr_log1p, cr_log2p1, cr_log10p1

Other: cr_cbrt, cr_rsqrt, cr_erf, cr_erfc, cr_lgamma, cr_tgamma

Bivariate: cr_pow, cr_hypot, cr_atan2, cr_atan2pi

Special: cr_sincos

Precision support

Type Platforms C suffix
Float64 All (none)
Float32 All f
Float16 Linux only f16

Float16 requires GCC 12+ for _Float16 support and is not available on macOS, FreeBSD, or Windows.

See also

  • core-math project — the upstream C library
  • CRlibm.jl — an earlier correctly-rounded math library for Julia (fewer functions, no Float32/Float16)