Numpy octuple точность float и 128 бит int. Почему и как?

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

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

Ответы

Ответ 1

Это очень интересный вопрос и, вероятно, есть причины, связанные с python, вычислением и/или аппаратным обеспечением. Не пытаясь дать полный ответ, вот что я хотел бы сделать...

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

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

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

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

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

Ответ 2

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

В случае динамического типа он сохраняет номер в массиве. Он также может расширить блок памяти, поэтому вы можете иметь целое число с 500 цифрами. Этот динамический тип называется bignum. В более старых версиях Python он был длинным. В новом 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