
Marc Glisse ha scritto:
Oh, so you extended gmp types with +-inf and NaN, that is interesting. Out of curiosity, how do you do that?
For mpz we overload the _mp_size field using MININT for -inf, MAXINT for +inf and MININT+1 for NaN.
For mpq we use -N/0 for -inf, +N/0 for +inf and 0/0 for NaN.
For both to check for special values is very fast as it can be done only testing the sizes and the overwriting of such special values is always safe inside gmplib.
Note that you still need to handle NaN separately (you could consider it another gmpxx bug that comparison (<,>,<=,>=) with NaN may do something other than return false).
Yes you're right, I was missing that.
You could say that the interaction between gmpxx types and double is only guaranteed to work in the finite case and the bug is in the missing documentation of this feature. It feels unsatisfactory to be able to say z<d (for an infinite d) but have (z-d) crash the program... This would argue in favor of pushing the appropriate code to a library that augments the gmpxx types with +-Inf and NaN. Which doesn't mean this won't be done in gmp...
Here I see three design alternatives:
1) gmplib/gmpxx is designed to return correct results only passing floating point finite values
2) gmplib/gmpxx is designed to store only finite values, but, when possible, it handles correctly inf and NaN
3) gmplib/gmpx can store finite/infinite and NaN values and handles them correctly. mpq is a superset of IEC559 floating point values domain.
Currently we are in a strange situation that we may call 1.5 where some times infinite values are taken, checked and correctly handled and other times don't.
IMHO a performance critical application like gmplib should reduce the handling of special cases in unavoidable paths to the minimum (as probably they are not needed for many users). We have done the same thing in the PPL adding a templatic policy argument to our numeric classes where it's specified if the user code expects special values treatment or not.
Notwithstanding that, I still think that currently gmplib has a bug (in code or documentation depending on intended design choices).