Точность восьмеричного числа с плавающей точкой и 128-битные числа. Почему и как?

Это в основном вопрос из любопытства. Я заметил, что набор тестовых данных содержит тесты для 128-битных целых чисел, и numerictypes модуль относится к int128, float256 ( восьмикратная точность?), и другие типы, которые, кажется, не отображаются в numpy dtypes на моей машине.

Моя машина 64-битная, но я могу использовать четырехместные 128-битные числа ( но не совсем). Я полагаю, что если в программном обеспечении возможно эмулировать четверные числа с плавающей запятой, теоретически можно также эмулировать числа с восьмым числом и 128-битные числа. С другой стороны, до сих пор я никогда не слышал ни о 128-битных целых, ни о восьмеричной точности с плавающей запятой. Почему в numpy есть ссылка на 128-битные целые и 256-битные числа? numerictypes модуль, если нет соответствующих dtypes, и как я могу их использовать?

2 ответа

Это очень интересный вопрос, и, вероятно, существуют причины, связанные с питоном, вычислениями и / или оборудованием. Не пытаясь дать полный ответ, вот к чему я бы пошел...

Прежде всего обратите внимание, что типы определяются языком и могут отличаться от вашей аппаратной архитектуры. Например, вы могли бы даже иметь двойники с 8-битным процессором. Конечно, любая арифметика включает в себя несколько инструкций процессора, что делает вычисления намного медленнее. Тем не менее, если ваше приложение требует этого, оно может стоить или даже потребоваться (лучше опоздать, чем ошибиться, особенно если, скажем, вы выполняете симуляцию для, скажем, стабильности моста...) Так где же требуется точность 128 бит? Вот статья в Википедии об этом...

Еще одна интересная деталь заключается в том, что когда мы говорим, что компьютер, скажем, 64-битный, это не полностью описывает аппаратное обеспечение. Существует множество частей, каждый из которых может быть (и, по крайней мере, был временами) разным битом: вычислительные регистры в ЦП, схема адресации памяти / регистры памяти и различные шины, с наиболее важной шиной от ЦП к памяти.

- АЛУ (арифметико-логическое устройство) имеет регистры, которые выполняют вычисления. Ваши машины являются 64-битными (не уверен, что это также означает, что они могут выполнять 2 32-битных вычисления в одно и то же время). Это, безусловно, самое важное количество для этого обсуждения. Давным-давно, это было то, что вы могли пойти и купить сопроцессор, чтобы ускорить это для расчетов с более высокой точностью...

- Регистры, которые содержат адреса памяти, ограничивают память, которую компьютер может видеть (напрямую), поэтому компьютеры, которые имели 32-битные регистры памяти, могли видеть только 2^32 байта (или приблизительно 4 ГБ). Обратите внимание, что для 16 бит это становится 65 КБ, что очень низкий. ОС может найти способ обойти это ограничение, но не для одной программы, поэтому ни одна программа на 32-битном компьютере обычно не может иметь более 4 ГБ памяти.

Обратите внимание, что эти ограничения составляют байты, а не биты. Это потому, что при обращении и загрузке из памяти мы загружаем байты. Фактически, как это делается, загрузка байта (8 бит) или 8 (64 бита == длина шины для вашего компьютера) занимает одно и то же время. Я спрашиваю адрес, а затем сразу получаю все биты через шину. Может случиться так, что в архитектуре все эти величины не равны количеству битов.

NumPy поразительно мощен и может обрабатывать числа, намного превышающие внутреннее представление процессора (например, 64 бит).

В случае динамического типа он хранит число в массиве. Он также может расширить блок памяти, поэтому у вас может быть целое число с 500 цифрами. Этот динамический тип называется bignum. В старых версиях Python это был тип long. В более новом Python (3.0+) есть только long, который называется int, который поддерживает почти произвольное количество цифр (-> bignum).

Если вы указываете тип данных (например, int32), то вы указываете битовую длину и битовый формат, т.е. какие биты в памяти означают что. Пример:

dt = np.dtype(np.int32)      # 32-bit integer
dt = np.dtype(np.complex128) # 128-bit complex floating-point number

Смотрите в: https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html

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