quad-fp:   quadruple-precision floating point
1 Predicate
Quad?
2 Conversion
double-flonum->quad-flonum
quad-flonum->double-flonum
string->quad-flonum
quad-flonum->string
quad-flonum->bytes
3 Arithmetic
qf+
qf-
qf*
qf/
4 Elementary functions
qfabs
qfsqrt
qfcbrt
qfpow
qfhypot
qfexp
qfexp2
qfexpm1
qflog
qflog2
qflog10
qflog1p
qfsin
qfcos
qftan
qfasin
qfacos
qfatan
qfatan2
qfsinh
qfcosh
qftanh
qfasinh
qfacosh
qfatanh
5 Rounding
qfceil
qffloor
qftrunc
qfround
qfrint
qfnearbyint
6 Special functions
qferf
qferfc
qflgamma
qftgamma
qfj0
qfj1
qfy0
qfy1
7 Other binary functions
qffmod
qfremainder
qfcopysign
qffdim
qfmax
qfmin
qfnextafter
qflogb
qffma
8 Comparison
qf=
qf<
qf<=
qf>
qf>=
9 Classification
qfnan?
qfinfinite?
qffinite?
qfsignbit?
qfsignaling?
10 Constants
quad-pi
quad-pi/  2
quad-pi/  4
quad-1/  pi
quad-2/  pi
quad-2/  sqrt-pi
quad-e
quad-log2e
quad-log10e
quad-ln2
quad-ln10
quad-sqrt2
quad-1/  sqrt2
quad-max
quad-min
quad-epsilon
quad-denorm-min
quad-mant-dig
quad-decimal-dig
quad-min-exp
quad-max-exp
quad-min-10-exp
quad-max-10-exp
11 Example
9.2

quad-fp: quadruple-precision floating point🔗ℹ

Shaobo He

 (require quad-fp) package: quad-fp

A toy Racket FFI binding to GCC’s libquadmath, exposing IEEE 754 quadruple-precision (128-bit, __float128) floating point — roughly 34 significant decimal digits, versus the ~16 of Racket’s native double flonums.

Values are opaque: a quad is shuttled across the FFI boundary as 128 bits and is only ever produced or consumed by the operations below.

The binding loads a native shared library (libquadf) that is compiled from source at install time, so a C toolchain with libquadmath must be present. See the package README for details.

1 Predicate🔗ℹ

procedure

(Quad? v)  boolean?

  v : any/c
Returns #t if v is a quad-precision value produced by this library, #f otherwise.

2 Conversion🔗ℹ

procedure

(double-flonum->quad-flonum x)  Quad?

  x : flonum?

procedure

(quad-flonum->double-flonum q)  flonum?

  q : Quad?
Convert between a Racket double flonum? and a quad. Widening a double is exact; narrowing back to a double rounds to nearest.

procedure

(string->quad-flonum s)  Quad?

  s : string?

procedure

(quad-flonum->string q [precision])  string?

  q : Quad?
  precision : exact-integer? = 36
Parse a decimal string into a quad (via strtoflt128), and render a quad to a decimal string with precision significant digits (via quadmath_snprintf). The default of 36 digits round-trips binary128 exactly.

procedure

(quad-flonum->bytes q)  bytes?

  q : Quad?
Returns the 16-byte little-endian representation of q’s __float128 bit pattern.

3 Arithmetic🔗ℹ

procedure

(qf+ a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qf- a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qf* a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qf/ a b)  Quad?

  a : Quad?
  b : Quad?
Quad-precision addition, subtraction, multiplication, and division.

4 Elementary functions🔗ℹ

procedure

(qfabs a)  Quad?

  a : Quad?

procedure

(qfsqrt a)  Quad?

  a : Quad?

procedure

(qfcbrt a)  Quad?

  a : Quad?

procedure

(qfpow a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qfhypot a b)  Quad?

  a : Quad?
  b : Quad?
Absolute value, square and cube roots, a raised to b, and (qfsqrt (qf+ (qf* a a) (qf* b b))) without overflow.

procedure

(qfexp a)  Quad?

  a : Quad?

procedure

(qfexp2 a)  Quad?

  a : Quad?

procedure

(qfexpm1 a)  Quad?

  a : Quad?

procedure

(qflog a)  Quad?

  a : Quad?

procedure

(qflog2 a)  Quad?

  a : Quad?

procedure

(qflog10 a)  Quad?

  a : Quad?

procedure

(qflog1p a)  Quad?

  a : Quad?
Exponentials (qfexpm1 computes ex-1 accurately near 0) and logarithms (qflog1p computes log(1+x)).

procedure

(qfsin a)  Quad?

  a : Quad?

procedure

(qfcos a)  Quad?

  a : Quad?

procedure

(qftan a)  Quad?

  a : Quad?

procedure

(qfasin a)  Quad?

  a : Quad?

procedure

(qfacos a)  Quad?

  a : Quad?

procedure

(qfatan a)  Quad?

  a : Quad?

procedure

(qfatan2 a b)  Quad?

  a : Quad?
  b : Quad?
Trigonometric functions and their inverses; qfatan2 is the two-argument arctangent.

procedure

(qfsinh a)  Quad?

  a : Quad?

procedure

(qfcosh a)  Quad?

  a : Quad?

procedure

(qftanh a)  Quad?

  a : Quad?

procedure

(qfasinh a)  Quad?

  a : Quad?

procedure

(qfacosh a)  Quad?

  a : Quad?

procedure

(qfatanh a)  Quad?

  a : Quad?
Hyperbolic functions and their inverses.

5 Rounding🔗ℹ

procedure

(qfceil a)  Quad?

  a : Quad?

procedure

(qffloor a)  Quad?

  a : Quad?

procedure

(qftrunc a)  Quad?

  a : Quad?

procedure

(qfround a)  Quad?

  a : Quad?

procedure

(qfrint a)  Quad?

  a : Quad?

procedure

(qfnearbyint a)  Quad?

  a : Quad?
Round toward +∞, -∞, zero, and nearest (ties away from zero for qfround; using the current rounding mode for qfrint and qfnearbyint).

6 Special functions🔗ℹ

procedure

(qferf a)  Quad?

  a : Quad?

procedure

(qferfc a)  Quad?

  a : Quad?

procedure

(qflgamma a)  Quad?

  a : Quad?

procedure

(qftgamma a)  Quad?

  a : Quad?

procedure

(qfj0 a)  Quad?

  a : Quad?

procedure

(qfj1 a)  Quad?

  a : Quad?

procedure

(qfy0 a)  Quad?

  a : Quad?

procedure

(qfy1 a)  Quad?

  a : Quad?
Error functions, log-gamma and gamma, and Bessel functions of the first (qfj0, qfj1) and second (qfy0, qfy1) kind, orders 0 and 1.

7 Other binary functions🔗ℹ

procedure

(qffmod a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qfremainder a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qfcopysign a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qffdim a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qfmax a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qfmin a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qfnextafter a b)  Quad?

  a : Quad?
  b : Quad?

procedure

(qflogb a)  Quad?

  a : Quad?

procedure

(qffma a b c)  Quad?

  a : Quad?
  b : Quad?
  c : Quad?
Floating-point remainder, IEEE remainder, sign copying, positive difference, maximum, minimum, next representable value toward b, unbiased exponent, and the fused multiply-add (qf+ (qf* a b) c) computed with a single rounding.

8 Comparison🔗ℹ

procedure

(qf= a b)  boolean?

  a : Quad?
  b : Quad?

procedure

(qf< a b)  boolean?

  a : Quad?
  b : Quad?

procedure

(qf<= a b)  boolean?

  a : Quad?
  b : Quad?

procedure

(qf> a b)  boolean?

  a : Quad?
  b : Quad?

procedure

(qf>= a b)  boolean?

  a : Quad?
  b : Quad?
Quad-precision comparisons, returning Racket booleans.

9 Classification🔗ℹ

procedure

(qfnan? a)  boolean?

  a : Quad?

procedure

(qfinfinite? a)  boolean?

  a : Quad?

procedure

(qffinite? a)  boolean?

  a : Quad?

procedure

(qfsignbit? a)  boolean?

  a : Quad?

procedure

(qfsignaling? a)  boolean?

  a : Quad?
Test for NaN, infinity, finiteness, a set sign bit, and signaling NaN.

10 Constants🔗ℹ

value

quad-pi : Quad?

value

quad-pi/2 : Quad?

value

quad-pi/4 : Quad?

value

quad-1/pi : Quad?

value

quad-2/pi : Quad?

value

quad-2/sqrt-pi : Quad?

value

quad-e : Quad?

value

quad-log2e : Quad?

value

quad-log10e : Quad?

value

quad-ln2 : Quad?

value

quad-ln10 : Quad?

value

quad-sqrt2 : Quad?

value

quad-1/sqrt2 : Quad?

The mathematical constants from libquadmath’s M_*q macros (π, π/2, π/4, 1/π, 2/π, 2/√π, e, log₂e, log₁₀e, ln 2, ln 10, √2, 1/√2).

Largest finite, smallest positive normal, machine epsilon, and smallest positive subnormal (FLT128_MAX, FLT128_MIN, FLT128_EPSILON, FLT128_DENORM_MIN).

Format characteristics: mantissa bits (113), round-trippable decimal digits (33), and the binary and decimal exponent ranges.

11 Example🔗ℹ

(require quad-fp)
(define a (double-flonum->quad-flonum 1.0))
(define b (double-flonum->quad-flonum 1e-20))
; In double, 1.0 + 1e-20 == 1.0; in quad the addend survives:
(qf= (qf+ a b) a)
; => #f
(quad-flonum->string (qf* quad-pi quad-pi))
; => "9.86960440108935861883449099987615081"