Software from Alan J. Miller

Applied statistics algorithms
Quadruple precision code (F)
Quadruple precision

Quadruple precision

There are multiple-precision (MP) software packages available when double precision is not adequate, but these are extremely slow. Quadruple precision gives about twice as many accurate digits as double precision and is much faster than MP.

  • quad.f90 Module for quadruple precision arithmetic on PC's, using operator overloading. This is designed for use with Lahey's LF90 compiler (you must use -o0, i.e. no optimization) or with Lahey's ELF90. For Compaq Visual Fortran 5.0 there is a separate version, quad_df.f90, of the main module now for Compaq which gives the same accuracy as Lahey's. This version works with SOME Unix f90 compilers and with Absoft Pro Fortran (Windows version) and NAS FortranPlus. For F (another subset of F90), Windows 95 version, there is quad.f. For the Lahey/Fujitsu LF95 compiler, use the Compaq version. N.B. Quadruple precision is built into LF95. It is easier to use than this version, and more accurate (about 1.8 decimals), but slower.
    I have learnt that Visual Basic sets the FPU in the same way as LF90 and F. If you are calling DLL's compiled in Fortran from VB, it may be necessary to use quad.f90 even though quad_df.f90 is the correct module for your Fortran compiler. This problem is likely to occur with other mixed language programming. With the Portland PGF90 compiler, I am told that you can use quad_df.f90, but you must use the undocumented flags -Kieee and -PC 64, to `turn off optimization'.
  • There is a short test program t_quad.f90, for testing the basic arithmetic operations (+-*/), and other test programs t_cubert.f90, t_cst.f90 and t_logexp.f90 for testing logs, exponential and trigonometric functions. To test the F version, use t_quad.f.
  • qcomplex.f90 Module for complex quad. prec. arithmetic.
  • From time to time I receive e-mail messages telling me that the quad. precision constants in my package are wrong. Before you do the same, look at prtconst.f90.
  • There are several example programs - hilbert.f90, which inverts a 10 x 10 Hilbert matrix, long_gj.f90, for Gauss-Jordan elimination and sym_eig.f90 which finds the eigenvalues and vectors of a symmetric matrix using Kaiser's method.
  • q_erf.f90 is a subroutine for calculating the error function and its complement in quadruple precision. Use q_erf.f if you are using F.
  • q_lngam.f90 is a function for the log of the gamma function.
  • hero.f90 A program for calculating coefficients for half-Hermite integration.
  • Polynomial equations can be extremely difficult to solve, and this is one place where extra precision is often required. q_pzeros.f90 is a module for solving polynomial equations, while q_poly20.f90 provides an example program. Requires the qcomplex module. Click here for more details, and a link to a multiple precision program.
    I am indebted to Keith Briggs (previouly at University of Cambridge) for access to his package in C++ for quadruple precision which helped improve the algorithm for calculating exponentials.
    There is a newer package for double-double precision and quad-double precision (about 64 decimal digits accuracy) in C++, which has a Fortran front-end, at Click here.