Найти - Пользователи
Полная версия: точность вычислений
Начало » Python для экспертов » точность вычислений
1 2 3 4
eiyawii
Андрей Светлов
В numpy нет float128 потому что он собран без поддержки этого типа.
MSVC, которым на Windows по умолчанию собирается Питон (и третьесторонние расширения) поддержки float128 не имеет — соответственно и numpy тоже оказывается обделенным.

Отсутствие поддержки проявляется именно как отсутствие атрибута `float128` модуля `numpy`.

если набрать
dir(numpy)
то действительно можно увидеть отсутствие float128, как в windows, так и в ubuntu. то есть дело не в ОС. зато можно увидеть тип данных longdouble

1. откуда можно взять float128 (windows, ubuntu)?

2. в numpy есть тип longdouble, который вроде как должен давать более точное представление, но тем не менее даёт всё то же 64 битное представление числа. вопрос: что необходимо, чтобы тип данных longdouble в питоне работал на полную катушку?

Андрей Светлов

У меня в 64битнной Убунте 12.04 float128 есть по умолчанию. К чему бы это?

eiyawii
Андрей, вот это хорошо.)
Я себе убунту поставил 32бит, там точно нет. Попробуем Ubuntu 64 bit, спасибо.

по умолчанию используется float64, как сделать так, чтобы во всем файле переменные были другого типа (float32 или float128, например)?
Андрей Светлов

Вероятно, вы несколько запутались. Желаете использовать float128 — пишите это явно. По умолчанию всё равно останется float64.

eiyawii

Андрей Светлов
Вероятно, вы несколько запутались. Желаете использовать float128 — пишите это явно. По умолчанию всё равно останется float64.

хорошо , буду явно переводить переменные в float128.

Поставил ubuntu 12.04 64 bit, установил numpy - в директории numpy действительно есть float128, но он работает не как я ожидал. по идее 112 бит после запятой отводится, а это примерно 34 десятичных знака. в терминале выдаёт вот что:
>>> float128(0.123456789012345678901234567890)
0.12345678901234567737
почему только 20 знаков и с таким кривым округлением?
Андрей Светлов

Потому что вы создаете numpy.float128 из стандартного float, который 64-битный.

eiyawii
Андрей Светлов
Потому что вы создаете numpy.float128 из стандартного float, который 64-битный.
как мне создать полноценный float128 в котором 34 десятичных разряда после запятой?

upd
>>> from numpy import float128 as f128
>>> f128(1/3.)
0.33333333333333331483
>>> f128(1/f128(3))
0.33333333333333333334
Андрей Светлов

Сами видите: задать нельзя, вычислить — можно.

eiyawii
Андрей Светлов
Сами видите: задать нельзя, вычислить — можно.
не вижу, почему 20 десятичных знаков, а не 34 обещанных?
Андрей Светлов

Есть там ваши биты, не переживайте. В вычислениях присутствуют.

In [31]: bytearray(numpy.float64(1))
Out[31]: bytearray(b'\x00\x00\x00\x00\x00\x00\xf0?')

In [32]: bytearray(numpy.float128(1))
Out[32]: bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x80\xff?\x00\x00\x00\x00\x00\x00')
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB