Форум сайта python.su
0
есть ряд значений, у которых около 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
Я не вполне понял, как именно вы считаете эти 14 знаков.
Нужно скомпилировать с поддержкой 128 битного float. GCC такое умеет, Microsoft Visual C compiler — нет.
Офлайн
0
Андрей Светловвывожу число (любое из этой последовательности) и смотрю сколько цифр после точки)
Я не вполне понял, как именно вы считаете эти 14 знаков.
Андрей Светловя не совсем понимаю, мне не удастся воспользоваться float128 под windows? а под linux всё будет импортироваться?
Нужно скомпилировать с поддержкой 128 битного float. GCC такое умеет, Microsoft Visual C compiler — нет.
Отредактировано eiyawii (Апрель 26, 2012 16:57:23)
Офлайн
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
Офлайн
0
a=0.1111111111111111111111111
>>> b=numpy.float96(a)
>>> b
0.1111111111111111
>>> b=numpy.float64(a)
>>> b
0.1111111111111111
1. почему нет разницы между типами float64 и float96?
2. что мне необходимо сделать, чтобы использовать класс float128 ?
Офлайн
14
Офлайн
0
я создаю в 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
почему так происходит? мне нужны эти разряды, которые отбрасываются при запуске файла, как сделать так, чтобы не округлялись числа?
Офлайн
3
eiyawii, в этом случае дело просто напросто в print, число не меняется, просто в вывод все не идет
Например, вот как в шелле:
>>> x = 0.12345678910111213 >>> x 0.12345678910111213 >>> print x 0.123456789101
Офлайн
3
eiyawii, если уж так совсем разобраться, то без принта выводится repr(x), а с принтом str(x). У типа float это разные С-реализации. В первом случае не указывается точность вывода, поэтому выводится число с максимальной точностью, во втором случае же выводится с точностью до PyFloat_STR_PRECISION знаков, в Python 2.7 эта константа равна 12.
Но тем не менее, это всего лишь отображение, само число остается тем же.
Офлайн
0
regall
eiyawii, если уж так совсем разобраться, то без принта выводится repr(x), а с принтом str(x). У типа float это разные С-реализации. В первом случае не указывается точность вывода, поэтому выводится число с максимальной точностью, во втором случае же выводится с точностью до PyFloat_STR_PRECISION знаков, в Python 2.7 эта константа равна 12.
Но тем не менее, это всего лишь отображение, само число остается тем же.
Андрей Светловкак мне его всё-таки использовать, какой/как его установить? есть 32бит проц, питон 2.7 и numpy 1.6.1, и pyscripter, windows. что сделать по шагам, чтобы я мог импортировать и работать с float128?
Использовать компилятор, который поддерживает float128 (нестандартный тип для C).
Офлайн