eiyawii
Апрель 26, 2012 15:42:02
есть ряд значений, у которых около 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.
Андрей Светлов
Апрель 26, 2012 16:46:56
Я не вполне понял, как именно вы считаете эти 14 знаков.
Нужно скомпилировать с поддержкой 128 битного float. GCC такое умеет, Microsoft Visual C compiler — нет.
eiyawii
Апрель 26, 2012 16:52:44
Андрей Светлов
Я не вполне понял, как именно вы считаете эти 14 знаков.
вывожу число (любое из этой последовательности) и смотрю сколько цифр после точки)
Андрей Светлов
Нужно скомпилировать с поддержкой 128 битного float. GCC такое умеет, Microsoft Visual C compiler — нет.
я не совсем понимаю, мне не удастся воспользоваться float128 под windows? а под linux всё будет импортироваться?
Андрей Светлов
Апрель 26, 2012 17:00:42
Считать нужно общее количество знаков, а не после точки. Смотрите 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
Апрель 26, 2012 20:48:55
a=0.1111111111111111111111111
>>> b=numpy.float96(a)
>>> b
0.1111111111111111
>>> b=numpy.float64(a)
>>> b
0.1111111111111111
1. почему нет разницы между типами float64 и float96?
2. что мне необходимо сделать, чтобы использовать класс float128 ?
Андрей Светлов
Апрель 26, 2012 22:59:19
- Вы создаете float96 из 64-битного питоновского float. Каким образом вы ожидаете появление дополнительных битов?
- Использовать компилятор, который поддерживает float128 (нестандартный тип для C).
eiyawii
Апрель 27, 2012 09:58:35
я создаю в 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
Апрель 27, 2012 11:05:58
eiyawii, в этом случае дело просто напросто в print, число не меняется, просто в вывод все не идет
Например, вот как в шелле:
>>> x = 0.12345678910111213
>>> x
0.12345678910111213
>>> print x
0.123456789101
regall
Апрель 27, 2012 11:15:44
eiyawii, если уж так совсем разобраться, то без принта выводится repr(x), а с принтом str(x). У типа float это разные С-реализации. В первом случае не указывается точность вывода, поэтому выводится число с максимальной точностью, во втором случае же выводится с точностью до PyFloat_STR_PRECISION знаков, в Python 2.7 эта константа равна 12.
Но тем не менее, это всего лишь отображение, само число остается тем же.
eiyawii
Апрель 27, 2012 12:23:21
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?