-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Decimal floating point arithmetic -- -- deka provides decimal floating point arithmetic. It is based on the -- decNumber C library, which is available at -- -- http://speleotrove.com/decimal/decnumber.html -- -- decNumber, in turn, implements the General Decimal Arithmetic -- Specification, which is available at -- -- http://speleotrove.com/decimal/ -- -- For more on deka, please see the Github home page at -- -- https://github.com/massysett/deka @package deka @version 0.4.0.4 -- | Documentation for Deka. -- -- At the moment, documentation is scattered about. Some of it is in the -- main README.md, which is in the source code tree and is viewable in -- Github at -- -- http://github.com/massysett/deka/blob/master/README.md -- -- Of course much of it is in the Haddock comments in the source code -- itself. -- -- There is also a module here, Data.Deka.Docs.Examples. It is in -- literate Haskell and has many comments. Unfortunately Haddock does not -- play well with Literate Haskell. However, the style of the file would -- not play well with Haddock anyway so I'm not sure I would ever switch -- back to regular Haskell for that file. -- -- So if you link to the file from the Haddock docs, you will just get a -- blank page. Fortunately it is easily readable in Github: -- -- -- http://github.com/massysett/deka/blob/master/lib/Data/Deka/Docs/Examples.hs module Data.Deka.Docs -- | Floating-point decimals. -- -- This uses the decNumber C library, so you will want to read the -- documentation about it to fully understand this module: -- -- http://speleotrove.com/decimal/decnumber.html -- -- http://speleotrove.com/decimal/decarith.html -- -- http://speleotrove.com/decimal/ -- -- Many of the comments on what these functions do are taken directly -- from the documentation for the decNumber C library. -- -- In particular, this module implements the decQuad type. decQuad -- supports up to 34 digits of precision and exponents between -6176 and -- 6111. It doesn't silently round, overflow, or underflow; rather, the -- library will notify you if these things happen. -- -- Many functions in this module clash with Prelude names, so you might -- want to do -- --
-- import qualified Data.Deka.Quad as Q --module Data.Deka.Quad -- | Decimal number. As indicated in the General Decimal Arithmetic -- specification, a Quad might be a finite number (perhaps the -- most common type) or it might be infinite or a not-a-number. -- decClass will tell you a little more about a particular -- Quad. data Quad data Round -- | Round toward positive infinity. roundCeiling :: Round -- | Round away from zero. roundUp :: Round -- | 0.5 rounds up roundHalfUp :: Round -- | 0.5 rounds to nearest even roundHalfEven :: Round -- | 0.5 rounds down roundHalfDown :: Round -- | Round toward zero - truncate roundDown :: Round -- | Round toward negative infinity. roundFloor :: Round -- | Round for reround round05Up :: Round -- | A single error or warning condition that may be set in the Ctx. data Flag -- | 0/0 is undefined. It sets this flag and returns a quiet NaN. divisionUndefined :: Flag -- | A non-zero dividend is divided by zero. Unlike 0/0, it has a -- defined result (a signed Infinity). divisionByZero :: Flag -- | Sometimes raised by divideInteger and remainder. divisionImpossible :: Flag -- | Raised on a variety of invalid operations, such as an attempt to use -- compareSignal on an operand that is an NaN. invalidOperation :: Flag -- | One or more non-zero coefficient digits were discarded during -- rounding. inexact :: Flag -- | A result is both subnormal and inexact. underflow :: Flag -- | The exponent of a result is too large to be represented. overflow :: Flag -- | A source string (for instance, in fromByteString) contained -- errors. conversionSyntax :: Flag -- | A container for multiple Flag indicating which are set and -- which are not. An instance of Exception so you can throw it if -- you want (no functions in this module throw.) data Flags unFlags :: Flags -> [Flag] setFlag :: Flag -> Flags -> Flags clearFlag :: Flag -> Flags -> Flags -- | Is this Flag set? checkFlag :: Flag -> Flags -> Bool -- | A Flags with no Flag set. emptyFlags :: Flags -- | The Ctx monad -- -- The General Decimal Arithmetic specification states that most -- computations occur within a context, which affects the manner -- in which computations are done (for instance, the context determines -- the rounding algorithm). The context also carries the flags that -- computations can set (for instance, a computation might set a flag to -- indicate that the result is rounded or inexact or was a division by -- zero.) The Ctx monad carries this context. data Ctx a -- | The current status flags, which indicate results from previous -- computations. getStatus :: Ctx Flags -- | Set the current status to whatever you wish. setStatus :: Flags -> Ctx () mapStatus :: (Flags -> Flags) -> Ctx () -- | The current rounding method getRound :: Ctx Round -- | Change the current rounding method setRound :: Round -> Ctx () -- | By default, rounding is set to roundHalfEven. No status flags -- are set initially. Returns the final status flags along with the -- result of the computation. runCtx :: Ctx a -> (a, Flags) -- | Like runCtx but does not return the final flags. evalCtx :: Ctx a -> a -- | Different categories of Quad. data DecClass -- | Signaling NaN sNan :: DecClass -- | Quiet NaN qNan :: DecClass -- | Negative infinity negInf :: DecClass -- | Negative normal number negNormal :: DecClass -- | Negative subnormal number negSubnormal :: DecClass -- | The negative zero negZero :: DecClass -- | The positive zero posZero :: DecClass -- | A positive subnormal number posSubnormal :: DecClass -- | A positive normal number posNormal :: DecClass -- | Positive infinity posInf :: DecClass -- | More information about a particular Quad. decClass :: Quad -> DecClass -- | Reads a ByteString, which can be in scientific, engineering, or -- "regular" decimal notation. Also reads NaN, Infinity, etc. Will return -- a signaling NaN and set invalidOperation if the string given is -- invalid. -- -- In the decNumber C library, this function was called -- fromString; the name was changed here because it doesn't take -- a regular Haskell String. fromByteString :: ByteString -> Ctx Quad -- | Converts a Quad to a string. May use non-scientific notation, -- but only if that's unambiguous; otherwise, uses scientific notation. -- -- In the decNumber C library, this is called toString; the name -- was changed here because this function doesn't return a Haskell -- String. toByteString :: Quad -> ByteString -- | Returns a string in engineering notation. -- -- In the decNumber C library, this is called toEngString; the -- name is changed here because the function does not return a regular -- Haskell String. toEngByteString :: Quad -> ByteString type C'int32_t = Int32 type C'uint32_t = Word32 fromInt32 :: C'int32_t -> Quad fromUInt32 :: C'uint32_t -> Quad -- | Uses the rounding method given rather than the one in the Ctx. -- If the operand is infinite, an NaN, or if the result of rounding is -- outside the range of a C'int32_t, then invalidOperation -- is set. inexact is not set even if rounding occurred. toInt32 :: Round -> Quad -> Ctx C'int32_t -- | Like toInt32 but if rounding removes non-zero digits then -- inexact is set. toInt32Exact :: Round -> Quad -> Ctx C'int32_t -- | toUInt32 r x returns the value of x, rounded to an -- integer if necessary using the rounding mode r rather than -- the one given in the Ctx. If x is infinite, or outside -- of the range of a C'uint32_t, then invalidOperation is -- set. inexact is not set even if rounding occurs. -- -- The negative zero converts to 0 and is valid, but negative numbers are -- not valid. toUInt32 :: Round -> Quad -> Ctx C'uint32_t -- | Same as toUInt32 but if rounding removes non-zero digits then -- inexact is set. toUInt32Exact :: Round -> Quad -> Ctx C'uint32_t add :: Quad -> Quad -> Ctx Quad subtract :: Quad -> Quad -> Ctx Quad multiply :: Quad -> Quad -> Ctx Quad -- | Fused multiply add; fma x y z calculates x * y + z. -- The multiply is carried out first and is exact, so the result has only -- one final rounding. fma :: Quad -> Quad -> Quad -> Ctx Quad divide :: Quad -> Quad -> Ctx Quad -- | divideInteger x y returns the integer part of the result -- (rounded toward zero), with an exponent of 0. If the the result would -- not fit because it has too many digits, divisionImpossible is -- set. divideInteger :: Quad -> Quad -> Ctx Quad -- | Remainder from integer division. If the intermediate integer does not -- fit within a Quad, divisionImpossible is raised. remainder :: Quad -> Quad -> Ctx Quad -- | Like remainder but the nearest integer is used for for the -- intermediate result instead of the result from divideInteger. remainderNear :: Quad -> Quad -> Ctx Quad -- | quantize x y returns z which is x set to -- have the same quantum as y; that is, numerically the same -- value but rounded or padded if necessary to have the same exponent as -- y. Useful for rounding monetary quantities. quantize :: Quad -> Quad -> Ctx Quad -- | Reduces coefficient to its shortest possible form without changing the -- value of the result by removing all possible trailing zeroes. reduce :: Quad -> Ctx Quad -- | Compares two Quad numerically. The result might be -1, -- 0, 1, or NaN, where -1 means x is less than -- y, 0 indicates numerical equality, 1 means y is -- greater than x. NaN is returned only if x or y is an NaN. -- -- Thus, this function does not return an Ordering because the -- result might be an NaN. compare :: Quad -> Quad -> Ctx Quad -- | Wrapper for compare that returns an Ordering rather than -- a Quad. Returns Just LT rather than -1, Just -- EQ rather than 0, and Just GT rather than 1, and -- Nothing rather than NaN. This is a pure function; it does not -- affect the Ctx. compareOrd :: Quad -> Quad -> Maybe Ordering -- | Same as compare, but a quietNaN is treated like a signaling NaN -- (sets invalidOperation). compareSignal :: Quad -> Quad -> Ctx Quad -- | Compares using an IEEE 754 total ordering, which takes into account -- the exponent. IEEE 754 says that this function might return different -- results depending upon whether the operands are canonical; Quad -- are always canonical so you don't need to worry about that here. compareTotal :: Quad -> Quad -> Ordering -- | Same as compareTotal but compares the absolute value of the two -- arguments. compareTotalMag :: Quad -> Quad -> Ordering -- | max x y returns the larger argument; if either (but not both) -- x or y is a quiet NaN then the other argument is the -- result; otherwise, NaNs, are handled as for arithmetic operations. max :: Quad -> Quad -> Ctx Quad -- | Like max but the absolute values of the arguments are used. maxMag :: Quad -> Quad -> Ctx Quad -- | min x y returns the smaller argument; if either (but not -- both) x or y is a quiet NaN then the other argument -- is the result; otherwise, NaNs, are handled as for arithmetic -- operations. min :: Quad -> Quad -> Ctx Quad -- | Like min but the absolute values of the arguments are used. minMag :: Quad -> Quad -> Ctx Quad -- | True only if both operands have the same exponent or are both NaNs -- (quiet or signaling) or both infinite. sameQuantum :: Quad -> Quad -> Bool -- | True if x is neither infinite nor a NaN. isFinite :: Quad -> Bool -- | True for infinities. isInfinite :: Quad -> Bool -- | True if x is finite and has exponent of 0; False -- otherwise. This tests the exponent, not the adjusted exponent. -- This can lead to results you may not expect: -- --
-- >>> isInteger . evalCtx . fromByteString . pack $ "3.00e2" -- True ---- --
-- >>> isInteger . evalCtx . fromByteString . pack $ "3e2" -- False ---- --
-- >>> isInteger . evalCtx . fromByteString . pack $ "3.00e0" -- False --isInteger :: Quad -> Bool -- | True only if x is zero or positive, an integer (finite with -- exponent of 0), and the coefficient is only zeroes and/or ones. isLogical :: Quad -> Bool -- | True for NaNs. isNaN :: Quad -> Bool -- | True only if x is less than zero and is not an NaN. isNegative :: Quad -> Bool -- | True only if x is finite, non-zero, and not subnormal. isNormal :: Quad -> Bool -- | True only if x is greater than zero and is not an NaN. isPositive :: Quad -> Bool -- | True only if x is a signaling NaN. isSignaling :: Quad -> Bool -- | True only if x has a sign of 1. Note that zeroes and NaNs may -- have sign of 1. isSigned :: Quad -> Bool -- | True only if x is subnormal - that is, finite, non-zero, and -- with a magnitude less than 10 ^ emin. isSubnormal :: Quad -> Bool -- | True only if x is a zero. isZero :: Quad -> Bool -- | Same effect as 0 + x where the exponent of the zero is the -- same as that of x if x is finite). NaNs are handled -- as for arithmetic operations. plus :: Quad -> Ctx Quad -- | Negation. Result has the same effect as 0 - x when the -- exponent of the zero is the same as that of x, if x -- is finite. minus :: Quad -> Ctx Quad -- | Absolute value. NaNs are handled normally (the sign of an NaN is not -- affected, and an sNaN sets invalidOperation. abs :: Quad -> Ctx Quad -- | copySign x y returns z, which is a copy of -- x but has the sign of y. This function never raises -- any signals. copySign :: Quad -> Quad -> Quad -- | Decrements toward negative infinity. nextMinus :: Quad -> Ctx Quad -- | Increments toward positive infinity. nextPlus :: Quad -> Ctx Quad -- | nextToward x y returns the next Quad in the direction -- of y. nextToward :: Quad -> Quad -> Ctx Quad -- | Digit-wise logical and. Operands must be: -- --
-- >>> maxBound + maxBound :: Deka --Flagged :: Flags -> DekaError instance [safe] Typeable DekaError instance [safe] Show DekaError instance [safe] Show Deka instance [safe] Show DekaT instance [safe] Ord DekaT instance [safe] Eq DekaT instance [safe] Bounded Deka instance [safe] Real Deka instance [safe] Num Deka instance [safe] Ord Deka instance [safe] Eq Deka instance [safe] Exception DekaError -- | If you are viewing this module in Haddock and expecting to see -- examples, you won't see anything. The file is written in literate -- Haskell, so the idea is that you will look at the source itself. You -- can look at the source in Haddock, but it will probably be poorly -- formatted because HsColour formats it rather oddly by default. The -- easiest way to see it is on Github: -- -- -- https://github.com/massysett/deka/blob/master/lib/Data/Deka/Docs/Examples.lhs module Data.Deka.Docs.Examples examples :: IO ()