Python中的双精度浮点值?[关闭]


83

是否有比浮点精度更好的数据类型?


3
这实际上是两个答案不同的问题。1:Python中的双精度值是浮点数; 2:比浮点数更好的精度数据类型是十进制。这样的问题可以以某种方式拆分吗?接受的答案地址为#2,但多数赞成的答案地址为#1。
bsplosion

Answers:


51

小数数据类型

  • 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。

如果您对性能问题感到困扰,请查看GMPY


如果我问的是原始问题,那么@larsmans就是答案(即使正式地说是题外话)。
Piotr Findeisen

@PiotrFindeisen那个答案在哪里?

不知道,但是现在我将引用@FredFoo。通常是“ Python中的双精度浮点值?” →“ float-s双精度”
Piotr Findeisen

117

Python的内置float类型具有双精度(double在CPython中为C,在Jython中为Java double)。如果需要更高的精度,请获取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
Jeff

16

对于某些应用程序,您可以使用Fraction而不是浮点数。

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

(对于其他应用程序,有decimal其他响应建议的。)


1
如何在小数和小数之间选择?分数似乎更好,因为它可以表示连续的分数,我想小数不能吗?
Janus Troelsen,2012年

1
@Janus:考虑您的需求,然后选择更适合他们的需求。Decimal当您要使用具有固定(但可配置)精度的近似数字时使用。使用Fraction时要与具体比例的工作,并准备忍受他们的无限存储需求。
加雷斯·里斯

分数是否支持您可以使用float进行的所有操作?
danijar

13

可能需要十进制

>>> from decimal import Decimal    
>>> Decimal(2.675)
Decimal('2.67499999999999982236431605997495353221893310546875')

浮点运算


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的二进制表示相比,变量的双长度二进制表示。没有小数点后两位。
克拉韦米尔2015年

你是对的。当我自己遇到这个问题时,我可能使用了错误的搜索条件,这就是结果。其他一些人可能会像我一样搜索相同的问题,并在此处结束。希望他们能有所缓解。:)
Bittikettu 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.