[library Boost.NumericConversion
    [quickbook 1.4]
    [authors [Cacciola Carballal, Fernando Luis]]
    [copyright 2004-2007 Fernando Luis Cacciola Carballal]
    [category numerics]
    [id numeric_conversion]
    [dirname numeric_conversion]
    [purpose
        Optimized Policy-based Numeric Conversions
    ]
    [source-mode c++]
    [license
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
[@http://www.boost.org/LICENSE_1_0.txt])
    ]
]

[/ Macros will be used for links so we have a central place to change them ]


[/ Cited Boost resources ]

[def __MPL_INTEGRAL_CONSTANT__ [@../../../../mpl/doc/refmanual/integral-constant.html MPL's Integral Constant] ]



[/ Other web resources ]

[def __SGI_UNARY_FUNCTION__ [@http://www.sgi.com/tech/stl/UnaryFunction.html Unary Function Object]]

[/ Icons ]

[def __NOTE__ [$images/note.png]]
[def __ALERT__ [$images/caution.png]]
[def __DETAIL__ [$images/note.png]]
[def __TIP__ [$images/tip.png]]
[def __QUESTION_MARK__ [$images/question.png]]
[def __SPACE__ [$images/space.png]]
[def __GO_TO__ [$images/callouts/R.png]]




[section Overview]

The Boost Numeric Conversion library is a collection of tools to describe and
perform conversions between values of different 
[link numeric_conversion_definitions_numeric_types numeric types].

The library includes a special alternative for a subset of `std::numeric_limits<>`,
the [link numeric_conversion_bounds bounds<>] traits class, which provides 
a consistent way to obtain the [link numeric_conversion_definitions_range boundary] 
values for the [link numeric_conversion_definitions_range range] of a numeric type.

It also includes a set of [link numeric_conversion_traits trait classes] 
which describes the compile-time
properties of a conversion from a source to a target numeric type.
Both [link numeric_conversion_cpp_arithmetic_types arithmetic] and 
[link numeric_conversion_definitions_numeric_types user-defined numeric types] can be used.

A policy-based [link numeric_conversion_converter converter] object which 
uses `conversion_traits` to select
an optimized implementation is supplied. Such implementation uses an optimal
range checking code suitable for the source/target combination.

* The converter's out-of-range behavior can be customized via an
[link numeric_conversion_policy_overflow_handler OverflowHandler] policy.
* For floating-point to integral conversions, the rounding mode can be selected via the
[link numeric_conversion_policy_float_to_int_rounder Float2IntRounder] policy.
* A custom low-level conversion routine (for UDTs for instance) can be passed via a
[link numeric_conversion_policy_raw_converter RawConverter] policy.
* The optimized automatic range-checking logic can be overridden via a
[link numeric_conversion_policy_user_range_checker UserRangeChecker] policy.

[endsect]



[include definitions.qbk]
[include converter.qbk]
[include requirements.qbk]
[include bounds.qbk]
[include conversion_traits.qbk]
[include converter_policies.qbk]
[include numeric_cast.qbk]



[section History and Acknowledgments]


[heading Pre-formal review]

* Kevlin Henney, with help from David Abrahams and Beman Dawes, originally contributed
the previous version of `numeric_cast<>` which already presented the idea of a runtime
range check.

* Later, Eric Ford, Kevin Lynch and the author spotted some genericity problems with
that `numeric_cast<>` which prevented it from being used in a generic layer of math
functions.

* An improved `numeric_cast<>` which properly handled all combinations of arithmetic
types was presented.

* David Abrahams and Beman Dawes acknowledged the need of an improved version of
`numeric_cast<>` and supported the submission as originally laid out. Daryl Walker and
Darin Adler made some important comments and proposed fixes to the original submission.

* Special thanks go to Björn Karlsoon who helped the author considerably. Having found the
problems with `numeric_cast<>` himself, he revised very carefully the original submission
and spot a subtle bug in the range checking implementation. He also wrote part of
this documentation and proof-read and corrected other parts. And most importantly:
the features now presented here in this library evolved from the original submission as
a result of the useful private communications between Björn and the author.

[heading Post-formal review]

* Guillaume Melquiond spoted some documentation and code issues, particularly about
rounding conversions.

* The following people contributed an important review of the design, documentation and c
ode: Kevin Lynch, Thorsten Ottosen, Paul Bristow, Daryle Walker, Jhon Torjo, Eric Ford,
Gennadiy Rozental.


[endsect]

[section Bibliography]

* Standard Documents: 
    # ISO/IEC 14882:98 (C++98 Standard)
    # ISO/IEC 9899:1999 (C99 Standard)
    # ISO/IEC 10967-1 (Language Independent Arithmetic (LIA), Part I, 1994)
    # ISO/IEC 2382-1:1993 (Information Technology - Vocabulary - Part I: Fundamental Terms)
    # ANSI/IEEE 754-1985 [and IEC 60559:1989] (Binary floating-point)
    # ANSI/IEEE 854-1988 (Radix Independent floating-point)
    # ANSI X3/TR-1-82 (Dictionary for Information Processing Systems)
    # ISO/IEC JTC1/SC22/WG14/N753 C9X Revision Proposal: LIA-1 Binding: Rationale
* Papers:
    # David Goldberg  What Every Computer Scientist Should Know About Floating-Point Arithmetic
    # Prof. William Kahan papers on floating-point.

[endsect]

















