Home

Anonymous coder0xff

Notice: This project has been migrated to GitHub. https://github.com/coder0xff/QPFloat

QPFloat (GPL 3.0)

For high-precision mathematics, the Quadruple-Precision Floating Point library (QPFloat) emulates the IEEE 754 2008 binary128 on x86, and x64 (and probably any other little-endian platform) using integer arithmetic and bit manipulation. It contains a native C++ and assembler implementation, and a .Net C++/CLI implementation.

Features

Much effort has been put into supporting a full feature set, including optimized transcendental functions and string conversion to full precision.

Standard operations

  • addition, subtraction, multiplication, division
  • Min, Max, Abs, Ceiling, Floor, Round, Truncate, Fraction
  • ToString and FromString
  • Cast operators to and from native numeric data types

Numeric information

  • IsZero
  • IsNaN
  • IsInfinite
  • IsSigned
  • IsSubNormal

Transcendental functions

  • natural logarithm (Ln), arbitrary-base logarithm (Log)
  • exponentiation (Exp)
  • power function (Pow)
  • Sin, Cos, Tan
  • ASin, ACos, ATan, ATan2

Miscellaneous features

  • Fast! Optimized low level bit manipulation
  • Hard coded constant Pi and E to full quadruple precision
  • Implemented on little-endian architecture, may or may not work on big-endian???
  • Strictly follows IEEE specifications to the extent availabile on Wikipedia.
  • Multiple guard bits
  • Arithmetic on sub-normals is fully supported.
  • Inf, -Inf, and NaN are fully supported.
  • round-to-even
  • emulates FPU exceptions with enable/disable flags (default: all disabled)

Using

VB.Net, C# users, and C++/CLI

  1. Add a reference to Release/QPFloat.dll (x64/Release/QPFloat.dll for x64)
  2. Create new variables using System.Quadruple

C++ users

  1. Add a reference to QPFloat.dll (x64/Release/QPFloat.dll for x64)
  2. include "__float128.h"
  3. create new variables using __float128

Compiling

Microsoft Visual C++

  • This code base can be compiled with or without /clr (Managed C++) to the compiler.
  • If /clr IS used, then this library can be used by C#, VB.Net, and C++/CLI via the type System.Quadruple.
  • If /clr IS NOT used, #ifdef _MANAGED has been used to automatically exclude the managed implementation.
  • Since extension methods can't be used to add static functions to System.Math, Operations like Abs, Sin, etc are static methods of Quadruple.
  • __float128 is the unmanaged (faster) implementation, which is still present even when /clr is used.

Other compilers

  • This code uses #ifdef to remove Microsoft specific functionality automatically (#ifdef _MANAGED)
  • Though I've not tried, it should be relatively easy to build using other compilers.
  • following existing conventions, __float128 is the type proffered by this library.