Python,浮点数可以有多长?

Python, How long decimal point can a float have?

提问人:Elvez The Elf 提问时间:5/14/2018 更新时间:5/18/2018 访问量:2537

问:

我做了一个圆周率计算器。但它只是更正前 7 个小数点并开始返回相同的结果。从外观上看,我的浮点值越来越大,因为我使用了限制。但是 python 中的十进制数有限制吗?我阅读了一些文档,但有些数字甚至小数点后 100 位,但我只能达到 11 位。

我的代码:

import math
import decimal
import datetime

sqrtt=1.
sumn=0.
tryc=0
outerrepeat=1000000000
while outerrepeat>0:
    tryc+=1
    repeat=10000000
    a=datetime.datetime.now()
    print "\n>>>Processing...\n"
    while repeat>0:

        sumn+=1/(sqrtt**2)
        sqrtt+=1
        repeat-=1
    b=datetime.datetime.now()
    print ">>>Process complete.\n"
    print ">>>Calculate time: "+str(b-a) + " Try-" + str(tryc) +" "+      str(math.sqrt(sumn*6)) + "\n"
    outerrepeat-=1


print "\nThis is all I can do."

可能有帮助:在空闲时运行。计算由巴塞尔问题完成。总是卡在 3.14159264498。也永远不会超过小数点后 11 位,但有时会更低。应该说我的极限 (sqrtt) 达到 10 的 8 次方(可能低于但高于 10 的 7 次方。 谢谢。

蟒蛇 python-2.7

评论

0赞 PM 2Ring 5/14/2018
这个著名的系列需要很长时间才能收敛;有更快的方法来计算 pi。但是你为什么不使用你导入的模块呢?它可以计算任意数量的平方根(假设您有足够的 RAM)。decimal
0赞 PM 2Ring 5/14/2018
FWIW,这是我不久前写的一些 Python 2 代码,它使用 decimal 模块将 pi 计算到高精度。它可以在一秒钟内完成 1000 位小数。
0赞 Elvez The Elf 5/14/2018
@PM2Ring 感谢您的 op 回答,但这超出了我作为大三学生所能接受的程度。:D
0赞 PM 2Ring 5/14/2018
嘿,别担心,我也不知道为什么这个算法会起作用。:)但是,如果您缓慢地浏览代码,则代码本身应该不会太难理解。
0赞 Elvez The Elf 5/14/2018
不是代码,而是算法,我只是在上高中。

答:

1赞 Håken Lid 5/14/2018 #1

在典型的 python 实现中,浮点数为 64 位,精度为 53 位。这是 15 到 17 位有效十进制数字。

https://en.wikipedia.org/wiki/Double-precision_floating-point_format

评论

0赞 Elvez The Elf 5/14/2018
谢谢,整数呢?
0赞 Tom Ron 5/14/2018
话虽如此,印刷品也修剪了一些精度——>>> math.sqrt(sumn*6) 3.1415925580959025 >>> str(math.sqrt(sumn*6)) '3.1415925581'
0赞 FHTMitchell 5/14/2018
根据定义,@ElvezTheElf整数的精度为 1。
1赞 Håken Lid 5/14/2018
当前版本的 python 中的整数没有固定的数字限制。Python 将分配足够的内存字节来存储您的整数,直到您用完 ram。
1赞 FHTMitchell 5/14/2018 #2

Python 使用 64 位浮点数,精度为 15 到 17 位十进制。

可以在这里找到证明,我们可以看到 python 值被存储为 C 双精度值(几乎总是 64 位浮点数)。float

typedef struct {
    PyObject_HEAD
    double ob_fval;  // this is the actual float value
} PyFloatObject;

您可以使用小数。用于无限精度的 Decimal 对象。

计算 e 的示例

import decimal
import math

decimal.getcontext().prec = 100  # set the precision, can be as large as you like

e = decimal.Decimal(0)
next_e = decimal.Decimal('NaN')  # init as not a number
i = 0

while e != next_e:
    e, next_e = next_e, e + decimal.Decimal(1) / math.factorial(i)
    i += 1


e #--> Decimal('2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166428')

评论

0赞 Elvez The Elf 5/14/2018
谢谢,你能做一个检查吗?就像我的代码一样。我真的很感激。
1赞 Håken Lid 5/14/2018
没有无限的精度。十进制具有固定精度。这就是使用它们的原因。
0赞 FHTMitchell 5/14/2018
@HåkenLid 当然,从文档中可以看出:“与基于硬件的二进制浮点不同,十进制模块具有用户可更改的精度(默认为 28 位),可以根据给定问题的需要尽可能大:”
0赞 Håken Lid 5/14/2018
您必须指定一个固定的精度。它可以比 28 大得多,但你不能有“无限”的精度。这是不可能的,因为它需要一台具有无限内存的计算机。
0赞 FHTMitchell 5/14/2018
但这是硬件限制,而不是软件限制。这与我们将 python 3 ints(python 2 longs)描述为具有无限大小的方式相同。这在计算机科学中很常见。
0赞 Superluminal 5/14/2018 #3

本教程也非常有用。浮点运算:问题和局限性

python floats 的精度以 17 位为边界。 “在运行 Python 的典型机器上,Python 浮点数有 53 位精度可用”。它不仅是python,而且是一个标准。因此,熟悉是有用的。