141

Are there data types with better precision than float?

1
  • 6
    This is actually two questions with different answers. 1: double precision values in python are floats, and 2: a better precision data type than float would be decimal. Can questions like this be split somehow? The accepted answer addresses #2, but most upvoted answer addresses #1. Commented Mar 15, 2019 at 14:30

5 Answers 5

195

Python's built-in float type has double precision (it's a C double in CPython, a Java double in Jython). If you need more precision, get NumPy and use its numpy.float128.

Sign up to request clarification or add additional context in comments.

7 Comments

Apparently, numpy.float128 often has 64 bit precision on a 64 bit system. numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1) returns 0.0. See stackoverflow.com/a/29821557/420755
0.1 + 0.2 is not exact 0.3 in python, in every other language this is a float problem but never a double problem. Why it is not exact 0.3 in python?
@FuscaSoftware It's a problem in other languages too. IEEE doubles can't represent 0.3 exactly. That sounds like a formatting artifact.
Funnily enough this was not mentioned in their documentation page, or any other page that speaks about "float precision" in Python.
@FuscaSoftware ... i dont understand ... "%.21f" % (0.2 + 0.3) '0.500000000000000000000' ... seems ok
|
74

Decimal datatype

  • Unlike hardware based binary floating point, the decimal module has a user alterable precision (defaulting to 28 places) which can be as large as needed for a given problem.

If you are pressed by performance issuses, have a look at GMPY

3 Comments

If I were asking the original question, then @larsmans's would be the answer (even though formally it's off-topic).
@PiotrFindeisen where is that answer?
No idea, but now I'd refer to @FredFoo. Generally "Double precision floating values in Python?" → "float-s are double precision"
24

For some applications you can use Fraction instead of floating-point numbers.

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

(For other applications, there's decimal, as suggested out by the other responses.)

3 Comments

how do I choose between Decimal and Fraction? Fraction seems better since it can represent continuing fractions which I guess Decimal can't?
@Janus: consider your requirements, and pick the one that fits them better. Use Decimal when you want to work with approximate numbers that have fixed (but configurable) precision. Use Fraction when you want to work with exact ratios, and are prepared to put up with their unbounded storage requirements.
Does Fraction support all the operations you can do with float?
22

May be you need Decimal

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

Floating Point Arithmetic

Comments

-3

Here is my solution. I first create random numbers with random.uniform, format them in to string with double precision and then convert them back to float. You can adjust the precision by changing '.2f' to '.3f' etc..

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)

3 Comments

Well. Double precision means double length binary representation of variable compared to binary representation of float. Not two decimal places.
You are right. I might have used bad search criteria when I had this problem myself and this is the outcome. Some others might search this same issue like I did and end up here. Hopefully they find some relief. :)
This is the worst way I can think of to round a float to two decimal places. You should at least use numpy.floor(100*a)/100 to truncate a number a to two decimal places.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.