Какова внутренняя точность 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.

Другие вопросы по тегам