【问题标题】:Python, How long decimal point can a float have?Python,浮点数可以有多长小数点?
【发布时间】:2018-05-18 16:24:51
【问题描述】:

我做了一个 pi 计算器。但它只是更正了前 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."

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

【问题讨论】:

  • 这个著名的系列需要很长时间才能收敛;有 很多 更快的方法来计算 pi。但是你为什么不使用你导入的decimal 模块呢?它可以计算任意多个位置的平方根(假设您有足够的 RAM)。
  • FWIW, here 是我不久前编写的一些 Python 2 代码,它使用十进制模块将 pi 计算为高精度。它可以在一秒钟内完成 1000 位小数。
  • @PM2Ring 感谢您的回答,但这比我作为一名大三学生所能接受的要多。 :D
  • 嘿,别担心,我也不知道这个算法为什么有效。 :) 但是如果你慢慢看,代码本身应该不会太难理解。
  • 不是算法代码,我刚上高中。

标签: python python-2.7


【解决方案1】:

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

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

【讨论】:

  • 谢谢,整数呢?
  • 话说打印也修剪了一些精度->>> math.sqrt(sumn*6) 3.1415925580959025 >>> str(math.sqrt(sumn*6)) '3.1415925581'
  • @ElvezTheElf 整数的精度定义为 1。
  • 当前版本的 python 中的整数没有固定的位数限制。 Python 将分配足够的内存字节来存储你的整数,直到你的内存用完。
【解决方案2】:

Python 使用精度为 15 to 17 decimal digits 的 64 位浮点数。

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

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

您可以使用decimal.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')

【讨论】:

  • 谢谢,可以举个例子吗?就像我的代码一样。我真的很感激。
  • 没有无限精度这种东西。十进制具有固定精度。这就是使用它们的原因。
  • @HåkenLid 当然有,来自文档:“与基于硬件的二进制浮点不同,十进制模块具有用户可更改的精度(默认为 28 位),它可以与对于给定的问题需要:"
  • 你必须指定一个固定的精度。它可以比 28 大得多,但你不能拥有“无限”的精度。这是不可能的,因为它需要一台具有无限内存的计算机。
  • 但这是硬件限制,不是软件限制。这与我们将 python 3 ints (python 2 longs) 描述为具有无限大小的方式相同。这在计算机科学中很常见。
【解决方案3】:

本教程也非常有用。 Floating Point Arithmetic: Issues and Limitations

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多