математика Python, Numpy модули разные результаты? - PullRequest
4 голосов
/ 19 октября 2011

Я получаю немного другие результаты, вычисляя косинус значения.Как я могу проверить, что эта разница находится в пределах точности станка?

import math
math.cos(60.0/180.0*math.pi)
-> 0.5000000000000001

import numpy
numpy.cos(60.0/180.0*numpy.pi)
-> 0.50000000000000011

Ответы [ 3 ]

10 голосов
/ 19 октября 2011

Разница, кажется, вызвана только процедурами форматирования:

>>> '%.30f' % math.cos(60./180.*math.pi)
'0.500000000000000111022302462516'
>>> '%.30f' % np.cos(60./180.*np.pi)
'0.500000000000000111022302462516'

Обратите внимание, что np.cos возвращает np.float64, а не float, и, очевидно, этот тип печатается по-другому по умолчанию. На обычном оборудовании они оба реализованы как 64-битные double, поэтому нет никакой реальной разницы в точности.

4 голосов
/ 19 октября 2011

Двойная точность арифметика дает вам точность 15-16 десятичных значащих цифр.Эти два значения соответствуют этой точности.Здесь не о чем беспокоиться.

Обратите внимание, что я говорю десятичное для контраста с 53 двоичными битами, используемыми для значения и в двоичном представлении значения двойной точности.

2 голосов
/ 19 октября 2011

Несмотря на то, что ваши числа оказались равными, все еще полезно знать, как их исследовать с полной точностью. Вот несколько способов сделать это:

>>> a = 1.1 + 2.2
>>> b = 3.3
>>> a == b
False
>>> from decimal import Decimal
>>> Decimal.from_float(a)
Decimal('3.300000000000000266453525910037569701671600341796875')
>>> Decimal.from_float(b)
Decimal('3.29999999999999982236431605997495353221893310546875')
>>> a.hex()
'0x1.a666666666667p+1'
>>> b.hex()
'0x1.a666666666666p+1'
>>> a.as_integer_ratio()
(7430939385161319, 2251799813685248)
>>> b.as_integer_ratio()
(3715469692580659, 1125899906842624)
...