Подтвердить что ты не робот

Какова внутренняя точность 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 имеет различную точность, зависящую от платформы, это также полезное знание для меня!

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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. Или еще лучше придерживаться двойников, если у вас нет поистине убедительной причины. Они будут быстрее, более портативны и т.д.