Hi,
I just noticed this using Christophe Gohlke's MKL builds of numpy:
>>> import numpy as np
>>> val = 2**63 + 2**62
>>> np.float64(val)
1.3835058055282164e+19
>>> np.float64(val).astype(np.uint64)
9223372036854775808
In general it seems that floats get clipped at 2**63 when casting to uint64. This appears to be a bug in MSVS express 2010 (the only version I tested):
<test_cast.c>
#include <stdio.h>
#include <math.h>
int main(int argc, char* argv[]) {
double fval = pow(2, 63) + pow(2, 11);
double fval2;
unsigned long long int ival = fval;
fval2 = ival;
printf("Float %f\n", fval);
printf("Integer %f\n", fval2);
printf("sizeof ulong %u\n", sizeof(unsigned long long int));
}
</test_cast.c>
Z:\>test_cast.exe
Float 9223372036854777900.000000
Integer 9223372036854775800.000000
sizeof ulong 8
I realize there's nothing much numpy can do about this, just thought I'd let y'all know.
Cheers,
Matthew