Плавающие значения двойной точности в Python? [закрыто]


84

Есть ли типы данных с большей точностью, чем float?


3
На самом деле это два вопроса с разными ответами. 1: значения двойной точности в python являются числами с плавающей запятой, а 2: тип данных с более высокой точностью, чем float, будет десятичным. Можно ли как-то разделить подобные вопросы? Принятый ответ адресован # 2, но наиболее одобренный ответ адресов # 1.
bsplosion

Ответы:


53

Десятичный тип данных

  • В отличие от аппаратных двоичных чисел с плавающей запятой, десятичный модуль имеет настраиваемую пользователем точность (по умолчанию 28 разрядов), которая может быть настолько большой, насколько это необходимо для данной проблемы.

Если вас беспокоят проблемы с производительностью, обратите внимание на GMPY.


Если бы я задавал исходный вопрос, то ответом был бы @ larsmans (хотя формально это не по теме).
Петр Финдейзен,

@PiotrFindeisen где этот ответ?
PleaseHelp

Понятия не имею, но сейчас я бы обратился к @FredFoo. Обычно "Плавающие значения двойной точности в Python?" → « float-s имеют двойную точность»
Петр Финдейзен

120

Встроенный floatтип Python имеет двойную точность (это C doubleв CPython, Java doubleв Jython). Если вам нужна более высокая точность, получите NumPy и используйте его numpy.float128.


15
По-видимому, numpy.float128часто имеет 64-битную точность в 64-битной системе. numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)возвращается 0.0. См. Stackoverflow.com/a/29821557/420755
Джефф,

0,1 + 0,2 не является точным 0,3 в python, на всех других языках это проблема с плавающей точкой, но никогда не двойная проблема. Почему в питоне не совсем 0,3?
Fusca Software

@FuscaSoftware Это проблема и на других языках. Двойники IEEE не могут точно представлять 0,3. Звучит как артефакт форматирования.
Ханс Масгрейв

17

Для некоторых приложений вы можете использовать Fractionвместо чисел с плавающей запятой.

>>> from fractions import Fraction
>>> Fraction(1, 3**54)
Fraction(1, 58149737003040059690390169)

(Для других приложений, decimalкак было предложено в других ответах.)


1
как выбрать между десятичной дробью и дробью? Дробь кажется лучше, поскольку она может представлять продолжающиеся дроби, которые, как я полагаю, не может быть десятичной?
Janus Troelsen

1
@Janus: рассмотрите свои требования и выберите тот, который им больше подходит. Используйте, Decimalесли вы хотите работать с приблизительными числами с фиксированной (но настраиваемой) точностью. Используйте, Fractionкогда вы хотите работать с точными пропорциями и готовы мириться с их неограниченными требованиями к хранению.
Гарет Рис,

Поддерживает ли Fraction все операции, которые вы можете делать с float?
danijar


1

Вот мое решение. Сначала я создаю случайные числа с помощью random.uniform, форматирую их в строку с двойной точностью, а затем конвертирую обратно в float. Вы можете настроить точность, изменив '.2f' на '.3f' и т. Д.

import random
from decimal import Decimal

GndSpeedHigh = float(format(Decimal(random.uniform(5, 25)), '.2f'))
GndSpeedLow = float(format(Decimal(random.uniform(2, GndSpeedHigh)), '.2f'))
GndSpeedMean = float(Decimal(format(GndSpeedHigh + GndSpeedLow) / 2, '.2f')))
print(GndSpeedMean)

1
Хорошо. Двойная точность означает двоичное представление переменной двойной длины по сравнению с двоичным представлением float. Не два десятичных знака.
Кравемир

Ты прав. Я мог использовать плохие критерии поиска, когда сам сталкивался с этой проблемой, и вот результат. Некоторые другие могут искать эту же проблему, как и я, и оказаться здесь. Надеюсь, они найдут какое-то облегчение. :)
Bittikettu 02

Это худший способ округлить число с плавающей запятой до двух знаков после запятой. Вы должны как минимум использовать numpy.floor(100*a)/100для усечения числа aдо двух десятичных знаков.
Wauzl
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.