
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 03/28/2010 04:50 PM, Scott McMurray wrote:
What operations result in NaNs, anyways?
Copying from the documentation: - ---------------------8<---------------------- To create a Not-a-Number, use the integer constructor that exists solely for that purpose. No other library function will return a Not-a-Number except under the following circumstances: * If a function that returns a non-reference integer tries to throw a blockable exception, but exceptions are blocked; * If the string-to-integer functions are asked to convert the string "#NaN#"; * If you call the function invmod, and there is no valid inverse; * If you call the function random_prime with a callback, and the callback function cancels it. - ---------------------8<----------------------
Are there any whose preconditions can't be trivially checked?
If you know your modular math, and never block exceptions, then no.
The only ones that come to mind are checking for 0 before division and checking for negatives before taking a square root, both of which are just as easily checked outside the operation as inside it.
Hm... you're right, taking the square root of a negative number *should* throw an exception. The library presently (and erroneously) returns zero. Thanks for the accidental catch. ;-)
So I'd say just throw instead of generating the NaN in the first place. With unbounded integers there's no underflow or overflow to worry about, so the advantage of the special values is questionable. (And I could make a wrapper to add the special values -- NaN, +Inf, -Inf, 1/+Inf, 1/-Inf -- if I needed.)
As mentioned in my last response to Jeffrey Hellrung, the NaN value is returned when the library needs to throw a blockable exception, but exceptions are blocked. Throwing an exception in that case is exactly what I *don't* want to do. - -- Chad Nelson Oak Circle Software, Inc. * * * -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAkuv0/kACgkQp9x9jeZ9/wQA8gCgrxkYowV1b/7ZEkFVtPPqXhvP 2oYAnjY2BmDuELhqpz5OdA0RpPQvPOb2 =QNcb -----END PGP SIGNATURE-----