GMP suggestions
Marc Glisse
marc.glisse at inria.fr
Sat May 22 11:33:44 CEST 2010
On Fri, 21 May 2010, Nic Schraudolph wrote:
>> Basically, TG thinks the overhead of having an infinity (and the effort to
>> add one) is too large. I guess you could try to convince him if you wrote a
>> prototype implementation and ran some benchmarks.
>
> I might give that a shot though I doubt my C++ is up to it...
Oh, you are thinking of doing it at the C++ level? I thought you meant to
do it at the C level.
>> Note that if you have infinity, you also need NaN for the result of Inf-Inf
>> or 0*Inf.
>
> Not necessarily - it may be acceptable to throw an exception for such
> expressions instead, analogous to division by zero when you don't have Inf.
I am not sure everybody would be happy with that (I haven't thought about
it much).
>> What kind of information would you want from numeric_limits? It could tell
>> you that radix=2, is_signed, is_integer for mpz but not the others,
>> is_exact for mpz and mpq but not mpf, !has_infinity, !is_bounded,
>> !is_modulo and not much more.
>
> Sure. It may seem trivial but just these few bits of information can be very
> useful to application code striving to be compatible with any reasonable
> numeric class. For instance, I can use
>
> vector<Type> vector;
>
> const Type upper_bound(numeric_limits<Type>::is_bounded ?
> numeric_limits<Type>::max() :
> (numeric_limits<Type>::has_infinity ? numeric_limits<Type>::infinity() :
> *max_element(vector.begin(), vector.end())));
>
> to upper-bound the elements of a (potentially very large) vector without
> having to calculate the max of its elements, if that can be avoided.
This already works currently: is_bounded and has_infinity are false by
default for types without an explicit specialization. You would need to
see if there is anything useful to do with is_exact, is_integer or
is_signed.
>> Things like digits don't fit in an int (or if you want to make them fit, it
>> is radix that won't fit anymore).
>
> It should be clear to an application that precision resp. range-related
> information is irrelevant for types that that state that they are exact resp.
> unbounded.
Probably.
> For mpf, range information can be given, and it may also be useful
> to communicate the current default precision here: numeric_limits is intended
> for code agnostic to the underlying numerical type, and such code will be
> ignorant of the additional precision parameter to mpf_class constructors
> anyway - so the default precision is what's relevant.
The code (typically in a library) may be type agnostic, but the numbers
may come from another code that set the precision, or the user may change
the default precision.
More information about the gmp-discuss
mailing list