¿Cómo convierto un flotador de Python a una cadena hexadecimal en Python 2.5? Solución no funcional adjunta

Lo que realmente necesito hacer es exportar un número de punto flotante a C sin pérdida de precisión.

Hice esto en Python:

import math import struct x = math.sqrt(2) print struct.unpack('ii', struct.pack('d', x)) # prints (1719614413, 1073127582) 

Y en CI prueba esto:

 #include  #include  int main(void) { unsigned long long x[2] = {1719614413, 1073127582}; long long lx; double xf; lx = (x[0] << 32) | x[1]; xf = (double)lx; printf("%lf\n", xf); return 0; } 

Pero en CI obtenemos:

7385687666638364672.000000 y no sqrt (2).

    ¿Qué me estoy perdiendo?

    Gracias.

    El código de Python parece funcionar. El problema está en el código C: tiene el derecho completo long long , pero luego convierte el valor entero directamente en coma flotante, en lugar de reinterpretar los bytes como un double . Si lanzas algunos punteros / direccionamiento a ella funciona:

     jkugelman$ cat float.c #include  int main(void) { unsigned long x[2] = {1719614413, 1073127582}; double d = *(double *) x; printf("%f\n", d); return 0; } jkugelman$ gcc -o float float.c jkugelman$ ./float 1.414214 

    Observe también que el especificador de formato para double (y para float ) es %f , no %lf . %lf es para long double .

    Si estás apuntando a una architecture little-endian,

     >>> s = struct.pack('>> ''.join('%.2x' % ord(c) for c in s) 'cd3b7f669ea0f63f' 

    si big-endian, use '>d' lugar de . En cualquier caso, esto le da una cadena hexadecimal como está solicitando en el título de la pregunta, y por supuesto, el código C puede interpretarla; No estoy seguro de qué tienen que ver esos dos ints con una "cadena hexadecimal".

    repr () es tu amigo.

     C:\junk\es2>type es2.c #include  #include  #include  int main(int argc, char** argv) { double expected, actual; int nconv; expected = sqrt(2.0); printf("expected: %20.17g\n", expected); actual = -666.666; nconv = scanf("%lf", &actual); assert(nconv == 1); printf("actual: %20.17g\n", actual); assert(actual == expected); return 0; } C:\junk\es2>gcc es2.c C:\junk\es2>\python26\python -c "import math; print repr(math.sqrt(2.0))" | a expected: 1.4142135623730951 actual: 1.4142135623730951 C:\junk\es2>