Плаваючі значення подвійної точності в Python? [зачинено]


83

Чи існують типи даних з кращою точністю, ніж float?


3
Це насправді два запитання з різними відповідями. 1: значення подвійної точності в python є плаваючими, а 2: кращий тип даних точності, ніж float, буде десятковим. Чи можна подібні запитання якось розділити? Прийняті адреси відповідей №2, але найбільш прихильні адреси відповідей №1.
bsplosion

Відповіді:


51

Десятковий тип даних

  • На відміну від апаратного заснованого двійкового числа з плаваючою комою, десятковий модуль має точність зміни, яку може змінити користувач (за замовчуванням до 28 знаків), яка може бути такою великою, як це потрібно для даної проблеми.

Якщо вас натискають випуски продуктивності, подивіться на GMPY


Якби я задавав оригінальне запитання, тоді @ larsmans's був би відповіддю (хоча формально це не в темі).
Piotr Findeisen

@PiotrFindeisen, де така відповідь?
Будь ласка, допоможіть

Не маю ідеї, але зараз я б посилався на @FredFoo. Загалом "Плаваючі значення подвійної точності в Python?" → " float-s мають подвійну точність"
Piotr Findeisen

117

Вбудований 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
Джефф

16

Для деяких програм ви можете використовувати Fractionзамість чисел із плаваючою комою.

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

(Для інших додатків є decimal, як пропонують інші відповіді.)


1
як вибрати між десятковою та дробовою? Дріб здається кращим, оскільки він може представляти постійні дроби, які, на мою думку, десяткові не можуть?
Янус Трольсен

1
@Janus: враховуй свої вимоги та вибирай ту, яка їм більше підходить. Використовуйте, Decimalколи ви хочете працювати з приблизними числами, які мають фіксовану (але налаштовувану) точність. Використовуйте, Fractionколи хочете працювати з точними співвідношеннями, і готові миритися з їх необмеженими вимогами до зберігання.
Gareth Rees

Чи підтримує дріб всі операції, які ви можете робити з плаваючою системою?
danijar


0

Ось моє рішення. Спочатку я створюю випадкові числа з random.uniform, форматую їх у рядки з подвійною точністю, а потім перетворюю назад у плаваючі. Ви можете налаштувати точність, змінивши ".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)

Ну. Подвійна точність означає подвійну довжину двійкового подання змінної порівняно з двійковим поданням float. Не два знаки після коми.
кравемір

Ти правий. Я міг використовувати погані критерії пошуку, коли у мене сама була така проблема, і це результат. Деякі інші можуть шукати цю ж проблему, як я, і опиняються тут. Сподіваємось, вони знайдуть якесь полегшення. :)
Bittikettu
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.