Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 26, 2012 15:42:02

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

точность вычислений

есть ряд значений, у которых около 20 десятичных разрядов после запятой, тип числе - Decimal.
при переводе типа Decimal в float64 получается 14 знаков после запятой, а должно быть 16.
for i in range(0,len(ff)):
ff=numpy.float64(ff)

если же в питон шелле написать выражение numpy.float64(Decimal(0.1234567890123456789)), то после преобразования как и положено остается 16 знаков после запятой, а не 14, как в случае, описанном выше. в чем дело?

и что необходимо для использования класса float128 из numpy? при попытке импортировать класс выдаёт ошибку ImportError: cannot import name float128.



Офлайн

#2 Апрель 26, 2012 16:46:56

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

точность вычислений

Я не вполне понял, как именно вы считаете эти 14 знаков.

Нужно скомпилировать с поддержкой 128 битного float. GCC такое умеет, Microsoft Visual C compiler — нет.



Офлайн

#3 Апрель 26, 2012 16:52:44

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

точность вычислений

Андрей Светлов
Я не вполне понял, как именно вы считаете эти 14 знаков.
вывожу число (любое из этой последовательности) и смотрю сколько цифр после точки)

Андрей Светлов
Нужно скомпилировать с поддержкой 128 битного float. GCC такое умеет, Microsoft Visual C compiler — нет.
я не совсем понимаю, мне не удастся воспользоваться float128 под windows? а под linux всё будет импортироваться?



Отредактировано eiyawii (Апрель 26, 2012 16:57:23)

Офлайн

#4 Апрель 26, 2012 17:00:42

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

точность вычислений

Считать нужно общее количество знаков, а не после точки. Смотрите IEEE-754.

У меня цифры почему-то не теряются:

In [6]: a = 1.1111111111111111

In [7]: a
Out[7]: 1.1111111111111112

In [8]: b = numpy.float64(a)

In [9]: b
Out[9]: 1.1111111111111112



Офлайн

#5 Апрель 26, 2012 20:48:55

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

точность вычислений


a=0.1111111111111111111111111
>>> b=numpy.float96(a)
>>> b
0.1111111111111111
>>> b=numpy.float64(a)
>>> b
0.1111111111111111

1. почему нет разницы между типами float64 и float96?

2. что мне необходимо сделать, чтобы использовать класс float128 ?



Офлайн

#6 Апрель 26, 2012 22:59:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

точность вычислений

  1. Вы создаете float96 из 64-битного питоновского float. Каким образом вы ожидаете появление дополнительных битов?
  2. Использовать компилятор, который поддерживает float128 (нестандартный тип для C).



Офлайн

#7 Апрель 27, 2012 09:58:35

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

точность вычислений

я создаю в Python Shell файл с таким кодом:

from numpy import float96
from decimal import Decimal
import math

q=10; N=10
uu = (math.log(10**q+((10**q)**2-1)**0.5))/9
print uu
k = ((math.e)**uu + (math.e)**(-uu))/(2.)
print k

когда исполняю этот файл в окне Python Shell появляются необходимые мне значения:

2.6354442345
7.01059752803

НО если я этот же код копирую в командную строку Python Shell и запускаю, то получаю более точные значения:

>>> q=10; N=10
uu = (math.log(10**q+((10**q)**2-1)**0.5))/9
k = ((math.e)**uu + (math.e)**(-uu))/(2.)
>>> uu
2.6354442345000444
>>> k
7.010597528033946

почему так происходит? мне нужны эти разряды, которые отбрасываются при запуске файла, как сделать так, чтобы не округлялись числа?



Офлайн

#8 Апрель 27, 2012 11:05:58

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

точность вычислений

eiyawii, в этом случае дело просто напросто в print, число не меняется, просто в вывод все не идет
Например, вот как в шелле:

>>> x = 0.12345678910111213
>>> x
0.12345678910111213
>>> print x
0.123456789101



Офлайн

#9 Апрель 27, 2012 11:15:44

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

точность вычислений

eiyawii, если уж так совсем разобраться, то без принта выводится repr(x), а с принтом str(x). У типа float это разные С-реализации. В первом случае не указывается точность вывода, поэтому выводится число с максимальной точностью, во втором случае же выводится с точностью до PyFloat_STR_PRECISION знаков, в Python 2.7 эта константа равна 12.

Но тем не менее, это всего лишь отображение, само число остается тем же.



Офлайн

#10 Апрель 27, 2012 12:23:21

eiyawii
От:
Зарегистрирован: 2011-08-04
Сообщения: 51
Репутация: +  0  -
Профиль   Отправить e-mail  

точность вычислений

regall
eiyawii, если уж так совсем разобраться, то без принта выводится repr(x), а с принтом str(x). У типа float это разные С-реализации. В первом случае не указывается точность вывода, поэтому выводится число с максимальной точностью, во втором случае же выводится с точностью до PyFloat_STR_PRECISION знаков, в Python 2.7 эта константа равна 12.

Но тем не менее, это всего лишь отображение, само число остается тем же.

как мне посмотреть какое число на самом деле?

Андрей Светлов
Использовать компилятор, который поддерживает float128 (нестандартный тип для C).
как мне его всё-таки использовать, какой/как его установить? есть 32бит проц, питон 2.7 и numpy 1.6.1, и pyscripter, windows. что сделать по шагам, чтобы я мог импортировать и работать с float128?



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version