James Y Knight wrote:
> On Oct 3, 2006, at 8:30 AM, Martin v. Löwis wrote:
>> As Michael Hudson observed, this is difficult to implement, though:
>> You can't distinguish between -0.0 and +0.0 easily, yet you should.
>
> Of course you can. It's absolutely trivial. The only part that's even
> *the least bit* sketchy in this is assuming that a double is 64 bits.
> Practically speaking, that is true on all architectures I know of,
> and if it's not guaranteed, it could easily be a 'configure' time check.
>
> typedef union {
> double d;
> uint64_t i;
> } rawdouble;
>
> int isposzero(double a) {
> rawdouble zero;
> zero.d = 0.0;
> rawdouble aa;
> aa.d = a;
> return aa.i == zero.i;
> }
>
> int main() {
> if (sizeof(double) != sizeof(uint64_t))
> return 1;
>
> printf("%d\n", isposzero(0.0));
> printf("%d\n", isposzero(-0.0));
>
> }
>
And you should be able to cache the single positive zero
with something vaguely like:
PyObject *
PyFloat_FromDouble(double fval)
{ ...
if (fval == 0.0 && raw_match(&fval, cached)) {
PY_INCREF(cached);
return cached;
}
...
--
-- Scott David Daniels
[EMAIL PROTECTED]
_______________________________________________
Python-Dev mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe:
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com