Какова внутренняя точность numpy.float128?
Какая точность соответствует внутреннему значению numpy.float128? Это __float128 или длинный двойной? (или что-то еще полностью!?)
Потенциальный ответ на вопрос, если кто-нибудь знает: безопасно ли в C приводить __float128 к длинному (16 байт) двойному символу, просто с потерей точности? (это для взаимодействия с C lib, который работает на длинных двойниках).
Изменить: В ответ на комментарий, платформа "Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric". Теперь, если numpy.float128 имеет различную точность в зависимости от платформы, это также полезное знание для меня!
Просто чтобы прояснить, меня интересует именно точность, а не размер элемента.
3 ответа
Рекомендуется использовать longdouble вместо float128, так как это довольно беспорядочно, банкомат. Python приведёт его к float64 во время инициализации.
Внутри NumPy это может быть двойной или длинный двойной. Он определен в npy_common.h и зависит от вашей платформы. Я не знаю, можете ли вы включить это из коробки в ваш исходный код.
Если вам не нужна производительность в этой части вашего алгоритма, более безопасный способ - экспортировать его в строку и впоследствии использовать strold.
numpy.longdouble
относится к любому типу вызовов вашего компилятора C long double
, В настоящее время это единственный тип с плавающей точкой с расширенной точностью, который поддерживает numpy.
В x86-32 и x86-64 это 80-битный тип с плавающей точкой. В более экзотических системах это может быть что-то другое (IIRC на Sparc - это реальное 128-битное число с плавающей запятой IEEE, а на PPC - двойное-двойное). (Это также может зависеть от того, какую ОС и компилятор вы используете - например, MSVC в Windows вообще не поддерживает какую-либо расширенную точность.)
Numpy также экспортирует некоторые имена, такие как numpy.float96
или же numpy.float128
, Какое из этих имен экспортируется, зависит от вашей платформы / компилятора, но все, что вы получаете, всегда ссылается на тот же базовый тип, что и longdouble
, Кроме того, эти имена вводят в заблуждение. Они не указывают 96- или 128-битный формат IEEE с плавающей запятой. Вместо этого они указывают количество битов выравнивания, используемых базовым long double
тип. Так, например, на x86-32, long double
80 бит, но дополняется до 96 бит для поддержания 32-битного выравнивания, и numpy вызывает это float96
, На x86-64, long double
опять же идентичный 80-битный тип, но теперь он дополняется до 128 бит для поддержания 64-битного выравнивания, и numpy вызывает это float128
, Там нет дополнительной точности, просто дополнительная обивка.
Рекомендация: игнорировать float96
/ float128
имена, просто используйте numpy.longdouble
, Или еще лучше придерживаться удвоений, если у вас нет действительно веских причин. Они будут быстрее, более портативными и т. Д.
TL; DR из numpy docs:
дополняется до системного значения по умолчанию; и предназначены для пользователей, которым требуется конкретное заполнение. Несмотря на названия,
np.float96
иnp.float128
обеспечивают только такую точность, какnp.longdouble
, то есть 80 бит на большинстве машин x86 и 64 бит в стандартных сборках Windows.