파이썬에서 배정 밀도 부동 값? [닫은]


84

float보다 정밀도가 더 높은 데이터 유형이 있습니까?


3
이것은 실제로 다른 답변을 가진 두 가지 질문입니다. 1 : 파이썬의 배정 밀도 값은 부동 소수점이고 2 : 부동 소수점보다 더 나은 정밀도 데이터 유형은 십진수입니다. 이와 같은 질문을 어떻게 든 분할 할 수 있습니까? 허용 된 답변 주소 # 2이지만 대부분의 찬성 응답 주소 # 1입니다.
bsplosion

답변:


53

십진수 데이터 유형

  • 하드웨어 기반 이진 부동 소수점과 달리, decimal 모듈은 주어진 문제에 필요한만큼 커질 수있는 사용자 변경 가능한 정밀도 (기본값은 28 자리)를 갖습니다.

성능 문제에 시달리면 GMPY를 살펴보십시오.


원래 질문을했다면 @ larsmans 's가 답이 될 것입니다 (공식적으로는 주제에서 벗어난 것임에도 불구하고).
Piotr Findeisen

@PiotrFindeisen 그 대답은 어디에 있습니까?
PleaseHelp

모르겠지만 이제 @FredFoo를 참조하겠습니다. 일반적으로 "파이썬의 배정 밀도 부동 값?" → " float-s가 있습니다 이중 정밀도"
표트르 FINDEISEN

120

Python의 내장 float유형은 배정 밀도 ( doubleCPython 의 C , doubleJython 의 Java )를 가지고 있습니다. 더 정밀도를 필요하면 얻을 NumPy와를 하고를 사용합니다 numpy.float128.


15
분명히 numpy.float12864 비트 시스템에서 64 비트 정밀도를 갖는 경우가 많습니다. numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)를 반환합니다 0.0. stackoverflow.com/a/29821557/420755
Jeff를

0.1 + 0.2는 파이썬에서 정확히 0.3이 아닙니다. 다른 모든 언어에서 이것은 float 문제이지만 결코 이중 문제는 아닙니다. 파이썬에서 정확히 0.3이 아닌 이유는 무엇입니까?
Fusca Software

@FuscaSoftware 다른 언어에서도 문제가됩니다. IEEE double은 0.3을 정확하게 나타낼 수 없습니다. 그것은 형식화 인공물처럼 들립니다.
Hans Musgrave

17

일부 응용 프로그램 Fraction의 경우 부동 소수점 숫자 대신 사용할 수 있습니다 .

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

(다른 응용 프로그램의 decimal경우 다른 응답에서 제안한대로이 있습니다.)


1
소수와 분수 중에서 어떻게 선택합니까? 분수는 Decimal이 할 수 없다고 생각하는 연속 분수를 나타낼 수 있기 때문에 더 좋아 보입니다.
Janus Troelsen 2012

1
@Janus : 귀하의 요구 사항을 고려하고 더 적합한 것을 선택하십시오. Decimal고정 된 (그러나 구성 가능한) 정밀도를 가진 대략적인 숫자로 작업하려는 경우 사용하십시오 . Fraction정확한 비율로 작업하고 무제한 스토리지 요구 사항을 감당할 준비가되어있을 때 사용 합니다.
Gareth Rees

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의 이진 표현과 비교하여 변수의 이중 길이 이진 표현을 의미합니다. 소수점 두 자리가 아닙니다.
kravemir

당신이 옳습니다. 이 문제가 발생했을 때 잘못된 검색 기준을 사용했을 수 있으며 이것이 결과입니다. 다른 사람들은 내가했던 것처럼 동일한 문제를 검색하여 여기에 올 수 있습니다. 바라건대 그들은 약간의 안도감을 찾았습니다. :)
Bittikettu 2015

이것은 내가 생각할 수있는 최악의 방법입니다. 최소한 소수점 이하 두 자리 numpy.floor(100*a)/100로 숫자 a를 자르 려면 을 사용해야 합니다.
Wauzl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.