[Python-checkins] r77655 - python/branches/py3k-cdecimal/Doc/library/cdecimal.rst

stefan.krah python-checkins at python.org
Thu Jan 21 17:24:53 CET 2010


Author: stefan.krah
Date: Thu Jan 21 17:24:52 2010
New Revision: 77655

Log:
Add cdecimal documentation.

Added:
   python/branches/py3k-cdecimal/Doc/library/cdecimal.rst   (contents, props changed)

Added: python/branches/py3k-cdecimal/Doc/library/cdecimal.rst
==============================================================================
--- (empty file)
+++ python/branches/py3k-cdecimal/Doc/library/cdecimal.rst	Thu Jan 21 17:24:52 2010
@@ -0,0 +1,131 @@
+:mod:`cdecimal` --- Decimal fixed point and floating point arithmetic
+=====================================================================
+
+.. module:: cdecimal
+   :synopsis: C-Implementation of the General Decimal Arithmetic Specification.
+
+.. moduleauthor:: Stefan Krah <skrah at bytereef.org>
+
+.. import modules for testing inline doctests with the Sphinx doctest builder
+.. testsetup:: *
+
+   import cdecimal
+   import math
+   from cdecimal import *
+   # make sure each group gets a fresh context
+   setcontext(Context())
+
+
+The :mod:`cdecimal` module is a C implementation of :mod:`decimal`. Since it is
+almost fully compatible with :mod:`decimal`, this documentation will only list
+the differences between the two modules.
+
+
+Setting Context Values
+----------------------
+
+* *prec*, *Emin*, *Emax*, *rounding*, *capitals* and *_clamp* are implemented as
+  getters/setters.
+
+* An additional field *_allcr* toggles correct rounding for :meth:`exp`,
+  :meth:`ln` and :meth:`log10`.
+
+* *traps* and *flags* have the custom type :class:`SignalDict`,
+  which behaves like a dictionary for most purposes. This is the familiar
+  interface from :mod:`decimal`.
+
+* Internally, *traps* and *flags* are just C unsigned integers. :mod:`cdecimal`
+  provides the option to access the integers directly using the getters/setters
+  *_traps* and *_flags*.
+
+* Use of the two interfaces can be mixed freely. The following table shows
+  how the :class:`SignalDict` items and the C-flags are related:
+
+  +---------------------------+------------------------------------+--------------------------------+
+  |         SignalDict        |              C signals             |          C conditions          |
+  +===========================+====================================+================================+
+  | :const:`InvalidOperation` |  :const:`DecIEEEInvalidOperation`  |              n/a               |
+  +---------------------------+------------------------------------+--------------------------------+
+  |            n/a            |                n/a                 | :const:`DecConversionSyntax`   |
+  +---------------------------+------------------------------------+--------------------------------+
+  |            n/a            |                n/a                 | :const:`DecDivisionImpossible` |
+  +---------------------------+------------------------------------+--------------------------------+
+  |            n/a            |                n/a                 | :const:`DecDivisionUndefined`  |
+  +---------------------------+------------------------------------+--------------------------------+
+  |            n/a            |                n/a                 | :const:`DecInvalidContext`     |
+  +---------------------------+------------------------------------+--------------------------------+
+  |            n/a            |                n/a                 | :const:`DecInvalidOperation`   |
+  +---------------------------+------------------------------------+--------------------------------+
+  |            n/a            |                n/a                 | :const:`DecMallocError`        |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`Clamped`          | :const:`DecClamped`                | :const:`DecClamped`            |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`DivisionByZero`   | :const:`DecDivisionByZero`         | :const:`DecDivisionByZero`     |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`Inexact`          | :const:`DecInexact`                | :const:`DecInexact`            |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`Rounded`          | :const:`DecRounded`                | :const:`DecRounded`            |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`Subnormal`        | :const:`DecSubnormal`              | :const:`DecSubnormal`          |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`Overflow`         | :const:`DecOverflow`               | :const:`DecOverflow`           |
+  +---------------------------+------------------------------------+--------------------------------+
+  | :const:`Underflow`        | :const:`DecUnderflow`              | :const:`DecUnderflow`          |
+  +---------------------------+------------------------------------+--------------------------------+
+
+
+Context Limits
+--------------
+
+
++------------+-----------------+---------------------+------------------------------+
+|            |     decimal     |  cdecimal, 32-bit   |      cdecimal, 64-bit        |
++============+=================+=====================+==============================+
+| max *Emax* |    unlimited    | :const:`425000000`  | :const:`999999999999999999`  |
++------------+-----------------+---------------------+------------------------------+
+| min *Emin* |    unlimited    | :const:`-425000000` | :const:`-999999999999999999` |
++------------+-----------------+---------------------+------------------------------+
+| max *prec* |    unlimited    | :const:`425000000`  | :const:`999999999999999999`  |
++------------+-----------------+---------------------+------------------------------+
+| min *Etop* | may be negative | :const:`0`          | :const:`0`                   |
++------------+-----------------+---------------------+------------------------------+
+
+
+*Etop* is only relevant if *_clamp* is set to 1. In this case, the maximum exponent
+is defined as *Etop* = *Emax* - (*prec*-1).
+
+
+Thread local default contexts
+-----------------------------
+
+When no context is given, all operations use the default context. In :mod:`decimal`,
+this default context is thread local. For :mod:`cdecimal`, thread local default contexts
+can be enabled at compile time. However, the performance penalty is so huge that
+this is not the default.
+
+The consequences for threaded programs are:
+
+* One new context has to be created for each thread.
+
+* Only context methods or methods that take a context argument can be used.
+
+
+Unlimited reading of decimals
+-----------------------------
+
+The :class:`Decimal` constructor is supposed to read input as if there were no limits.
+Since the context of cdecimal has limits, the following approach is used:
+
+If the :const:`Inexact` or :const:`Rounded` conditions occur during conversion,
+:const:`InvalidOperation` is raised and the result is :const:`NaN`. In this case,
+the :meth:`create_decimal` context method has to be used.
+
+
+Correct rounding in the power method
+------------------------------------
+
+The :meth:`power()` method in :mod:`decimal` is correctly rounded. :mod:`cdecimal`
+currently only guarantees an error less than one ULP (which is standard conforming).
+
+
+


More information about the Python-checkins mailing list