Home > Enterprise >  How to fix the number of decimals to 500 digits output in Python?
How to fix the number of decimals to 500 digits output in Python?

Time:08-22

In the following example:

import math
x = math.log(2)
print("{:.500f}".format(x))    

I tried to get 500 digits output I get only 53 decimals output of ln(2) as follows:

0.69314718055994528622676398299518041312694549560546875000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

How I can fix this problem?

CodePudding user response:

You can't with the Python float type. It's dependent on the underlying machine architecture, and in most cases you're limited to a double-precision float.

However, you can get higher precision with the decimal module:

>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 500
>>> d = Decimal(2)
>>> d.ln()
Decimal('0.69314718055994530941723212145817656807550013436025525412068000949339362196969471560586332699641868754200148102057068573368552023575813055703267075163507596193072757082837143519030703862389167347112335011536449795523912047517268157493206515552473413952588295045300709532636664265410423915781495204374043038550080194417064167151864471283996817178454695702627163106454615025720740248163777338963855069526066834113727387372292895649354702576265209885969320196505855476470330679365443254763274495125040607')

CodePudding user response:

I tried to get 500 digits output I get only 53 decimals output of ln(2) as follows:

The problem is not in the printing. The 500 digit output is the exact value returned from math.log(2).

The return value of math.log(2) is encoded using binary64 which can only represent about 264 different finite values - each of them is a dyadic rational. Mathematically log(2) is an irrational number, thus it is impossible for x to encode the math result exactly.

Instead math.log(2) returns the nearest encodable value. That value is exactly 0.6931471805599452862267639829951804131269454956054687500...

Printing with more than 17 significant digits typically does not add important value information.

  • Related