Найти - Пользователи
Полная версия: точность вычислений
Начало » Python для экспертов » точность вычислений
1 2 3 4
eiyawii
есть ряд значений, у которых около 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.
Андрей Светлов

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

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

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

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

Считать нужно общее количество знаков, а не после точки. Смотрите 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
eiyawii

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

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

2. что мне необходимо сделать, чтобы использовать класс float128 ?
Андрей Светлов
  1. Вы создаете float96 из 64-битного питоновского float. Каким образом вы ожидаете появление дополнительных битов?
  2. Использовать компилятор, который поддерживает float128 (нестандартный тип для C).
eiyawii
я создаю в 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

почему так происходит? мне нужны эти разряды, которые отбрасываются при запуске файла, как сделать так, чтобы не округлялись числа?
regall
eiyawii, в этом случае дело просто напросто в print, число не меняется, просто в вывод все не идет
Например, вот как в шелле:
>>> x = 0.12345678910111213
>>> x
0.12345678910111213
>>> print x
0.123456789101
regall
eiyawii, если уж так совсем разобраться, то без принта выводится repr(x), а с принтом str(x). У типа float это разные С-реализации. В первом случае не указывается точность вывода, поэтому выводится число с максимальной точностью, во втором случае же выводится с точностью до PyFloat_STR_PRECISION знаков, в Python 2.7 эта константа равна 12.

Но тем не менее, это всего лишь отображение, само число остается тем же.
eiyawii
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?
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