deka-0.6.0.2: Decimal floating point arithmetic

Safe HaskellSafe-Inferred
LanguageHaskell2010

Deka.Abstract

Description

Abstract representation of numbers.

The General Decimal Arithmetic Specification gives an abstract representation of each number. This information is taken from the General Decimal Arithmetic specification at

http://speleotrove.com/decimal/damodel.html

A number may be finite, in which case it has three components: a sign, which must be zero (for zero or positive numbers) or one (for negative zero and negative numbers), an integral coefficient, which is always zero or positive, and a signed integral exponent, which indicates the power of ten by which the number is multiplied. The value of a finite number if given by

(-1) ^ sign * coefficient * 10 ^ exponent

In addition to finite numbers, a number may also be one of three special values:

  • infinity - numbers infinitely large in magnitude
  • quiet NaN - an undefined result which does not cause an invalidOperation condition.
  • signaling NaN - an undefined result which will usually cause an invalidOperation condition.

When a number has one of these special values, its coefficient and exponent are undefined. An NaN, however, may have additional diagnostic information, which is a positive integer.

All special values have a sign. The sign of an infinity is significant. The sign of an NaN has no meaning, though it may be considered as part of the diagnostic information.

This module allows you to represent a number in abstract terms. It's abstract in the sense that you cannot use the abstract form to perform arithmetic. It is useful, however, because you might want to manipulate the abstract form in your own programs--to make a pretty printer with digit grouping, for example.

You can transform an abstract form to a Dec losslessly by using abstractToByteString. This gives you a string in scientific notation, as specified in to-scientific-string in the specification. There is a one-to-one mapping of abstract representations to scientific-string representations. You can also transform a Dec to an Abstract losslessly by using abstractFromByteString. This operation will not fail if it is using output from toByteString; but it might fail otherwise, if the input is malformed.

All typeclass instances in this module are derived; so while the Ord instance might be useful to use Abstract as the key in a Map, don't expect it to tell you anything about how to Abstract are situated on the number line.