Author:Fernando Cacciola

Contact:fernando.cacciola@gmail.com

Organization:SciSoft

Date:2005-08-29

Number:N1880=05-0140## A proposal to extend numeric_limits for consistent range query (Revision 1)

Motivation and Scope

`numeric_limits::min()`

(18.2.1.2) is defined with a meaning which is inconsistent across integer and floating-point types. Specifically, for integer types, it is the minimum finite value whereas for floating point types it is the minimumpositivenormalized value. The inconsistency here lies in the interpretation ofminimum: in the case of integer types, it signifieslowest, while for floating point types, it signifiessmallest non-zero.Though the smallest non-zero value of a floating point type is important for floating point computations, the lowest arithmetic value is important because it indicates the lower bound of the numeric range. In fact, lowest is a concept applicable to any arithmetic type and so is more general.

Using

`numeric_limits<T>::min()`

, the lowest value is given by:

`numeric_limits<T>::min()`

if`T`

is an integer type`-numeric_limits<T>::max()`

if`T`

is a floating-point typeIn practice, the inconsistency causes two problems: first, usage of

`numeric_limits::min()`

in generic code requires the code to distinguish if the type is integer or floating point, and to do so using template metaprogramming if performance is important. Second, and more important, it confuses users. A web search for "numeric_limits::min" shows that ever since the Standard was released and up to the present day lots of users get this the wrong way expecting min() to mean lowest.This proposal suggests to fix this by adding the additional function

`numeric_limits::lowest()`

.

Impact On the StandardThe proposal is not to change the meaning of min() (which could break existing code) but to add a new lowest() function that provides the expected meaning consistently.

Proposed Text for the Standard

A.Add to 18.2.1.1 [lib.numeric.limits]:`static T lowest() throw;`

below`max();`

B. Insert in 18.2.1.2 [lib.numeric.limits.members], below`max()`

:static T lowest() throw();1.For integer types, returns min(); for floating point types, return -max();

AcknowledgementsAll the people in the boost community, particularly those involved in the development of the Boost.NumericConversion library.

Thorsten Ottosen for his help preparing this proposal.

ReferencesBoost.Numeric Conversion Library, http://www.boost.org/libs/numeric/conversion/doc/index.html, Fernando Cacciola