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

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

2 Solutions collect form web for “Какова внутренняя точность numpy.float128?”

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

  • Евклидово расстояние с весами
  • Scipy редкие ... массивы?
  • Использование радиальных базовых функций для интерполяции функции на сфере
  • openCV 3.0 python LineIterator
  • Сравнение скорости суммирования массива Numpy и Matlab
  • Почему B = numpy.dot (A, x) настолько медленнее, что цикл B = numpy.dot (A , x))?
  • Существует ли встроенная функция numpy, чтобы отклонять выбросы из списка
  • ImportError: нет модуля с именем 'pandas.indexes'
  • Python - лучший язык программирования в мире.