Какова внутренняя точность numpy.float128? - PullRequest
22 голосов
/ 30 января 2012

Какую точность отображает numpy.float128 для внутреннего использования? Это __float128 или длинный двойной? (или что-то еще полностью!?)

Потенциальный ответ на вопрос, если кто-нибудь знает: безопасно ли в C приводить __float128 к длинному (16 байт) двойному результату, просто потеряв точность? (это для взаимодействия с C lib, которая работает на длинных двойных числах).

Редактировать: В ответ на комментарий платформа называется «Linux-3.0.0-14-generic-x86_64-with-Ubuntu-11.10-oneiric». Теперь, если numpy.float128 имеет различную точность в зависимости от платформы, это также полезно для меня!

Просто чтобы прояснить, это точность меня интересует, а не размер элемента.

Ответы [ 2 ]

38 голосов
/ 10 июня 2013

numpy.longdouble относится к любому типу, который ваш компилятор C вызывает long double.В настоящее время это только тип с плавающей точкой с расширенной точностью, который поддерживает numpy.

На x86-32 и x86-64 это 80-битный тип с плавающей точкой .В более экзотических системах это может быть что-то другое (IIRC на Sparc - это 128-битный IEEE-код с плавающей запятой, а на PPC - double-double ).(Это также может зависеть от того, какую ОС и компилятор вы используете - например, 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.Или еще лучше придерживаться удвоений, если у вас нет действительно веских причин.Они будут быстрее, портативнее и т. Д.

7 голосов
/ 30 января 2012

Рекомендуется использовать longdouble вместо float128 , поскольку это довольно беспорядок , банкомат. Python приведёт его к float64 во время инициализации.

Внутри NumPy это может быть двойной или длинный двойной. Он определен в npy_common.h и зависит от вашей платформы. Я не знаю, можете ли вы включить это из коробки в ваш исходный код.

Если вам не нужна производительность в этой части вашего алгоритма, более безопасный способ - экспортировать ее в строку и впоследствии использовать strold .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...