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