¿Cuál es la precisión interna de numpy.float128?

¿Qué precisión se asigna internamente a numpy.float128? ¿Es __float128 o largo doble? (o algo completamente distinto?)

Una pregunta de seguimiento potencial si alguien sabe: ¿es seguro en C lanzar un __float128 a un doble de 16 bytes, con solo una pérdida de precisión? (esto es para interactuar con un C-lib que opera en dobles largos).

Edit: En respuesta al comentario, la plataforma es ‘Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric’. Ahora, si numpy.float128 tiene una precisión variable dependiendo de la plataforma, ¡también es un conocimiento útil para mí!

Solo para ser claros, es la precisión que me interesa, no el tamaño de un elemento.

Es bastante recomendable usar longdouble en lugar de float128 , ya que es un desastre , un cajero automático. Python lo lanzará a float64 durante la inicialización.

Dentro de numpy, puede ser un doble o un doble largo. Se define en npy_common.h y depende de su plataforma. No sé si puede incluirlo fuera de la caja en su código fuente.

Si no necesita rendimiento en esta parte de su algoritmo, una forma más segura podría ser exportarlo a una cadena y usar strold después.

numpy.longdouble refiere a cualquier tipo que su comstackdor C llame long double . Actualmente, este es el único tipo de punto flotante de precisión extendida que soporta Numpy.

En x86-32 y x86-64, este es un tipo de punto flotante de 80 bits . En sistemas más exóticos puede ser otra cosa (IIRC en Sparc es un flotador IEEE de 128 bits, y en PPC es doble-doble ). (También puede depender de qué sistema operativo y comstackdor esté utilizando, por ejemplo, MSVC en Windows no admite ningún tipo de precisión extendida).

Numpy también exportará algún nombre como numpy.float96 o numpy.float128 . Cuál de estos nombres se exporta depende de su plataforma / comstackdor, pero lo que obtenga siempre se refiere al mismo tipo subyacente que longdouble . Además, estos nombres son altamente engañosos. No indican un formato de punto flotante IEEE de 96 o 128 bits. En su lugar, indican el número de bits de alineación utilizados por el tipo long double subyacente. Entonces, por ejemplo, en x86-32, el long double es de 80 bits, pero se rellena hasta 96 bits para mantener la alineación de 32 bits, y numpy lo llama float96 . En x86-64, el long double es de nuevo el tipo idéntico de 80 bits, pero ahora se rellena hasta 128 bits para mantener la alineación de 64 bits, y numpy lo llama float128 . No hay precisión extra, solo relleno adicional.

Recomendación: ignore los nombres float96 / float128 , simplemente use numpy.longdouble . O mejor aún, apéguese a los dobles a menos que tenga una razón verdaderamente convincente. Serán más rápidos, más portátiles, etc.