如何获得最大可能的精度?(Python-十进制)

如何获得最大可能的精度?(Python-十进制),python,memory,floating-point,decimal,precision,Python,Memory,Floating Point,Decimal,Precision,我正在使用该类进行需要精确性的操作 我希望使用“最大可能”的精度。有了这个,我的意思是精确到程序运行的系统可以处理的程度 要设置某个精度,很简单: import decimal decimal.getcontext().prec = 123 #123 decimal precision 我试图计算出“Decimal”类可以计算的最大精度: print(decimal.MAX_PREC) >> 999999999999999999 因此,我尝试将精度设置为最大精度(知道它可能无法工

我正在使用该类进行需要精确性的操作

我希望使用“最大可能”的精度。有了这个,我的意思是精确到程序运行的系统可以处理的程度

要设置某个精度,很简单:

import decimal
decimal.getcontext().prec = 123 #123 decimal precision
我试图计算出“Decimal”类可以计算的最大精度:

print(decimal.MAX_PREC)
>> 999999999999999999
因此,我尝试将精度设置为最大精度(知道它可能无法工作..):

但是,当然,这会抛出一个内存错误(关于除法)

所以我的问题是:如何计算出当前系统能够处理的最大精度

额外信息:

import sys
print(sys.maxsize)
>> 9223372036854775807

我想推荐一个函数,允许您以蛮力方式估算给定操作的最大精度:

def find_optimum(a,b, max_iter):
    for i in range(max_iter):
        print(i)
        c = int((a+b)/2)
        decimal.getcontext().prec = c
        try:
            dummy = decimal.Decimal(1)/decimal.Decimal(7) #your operation
            a = c
            print("no fail")
        except MemoryError:
            print("fail")
            dummy = 1
            b = c
        print(c)
        del dummy
这只是一步一步地将间隔减半,并查看是否发生错误。用
max\u iter=10
a=int(1e9),b=int(1e11)
调用,给出:

>>> find_optimum(int(1e9), int(1e11), 10)
0
fail
50500000000
1
no fail
25750000000
2
no fail
38125000000
3
no fail
44312500000
4
fail
47406250000
5
fail
45859375000
6
no fail
45085937500
7
no fail
45472656250
8
no fail
45666015625
9
no fail
45762695312
这可能会让你大致了解你在处理什么。这在i5-3470和16GB RAM上花费了大约半个小时,因此您实际上只会将其用于测试目的

我不认为有一种实际的精确方法可以获得操作的最大精度,因为您必须准确地了解内存使用对内存消耗的依赖性。我希望这至少能帮你一点忙,我真的很想知道,你需要这种精度做什么

编辑我觉得这真的需要添加,因为我在这里的顶级帖子下面读到了你的评论。以这种方式使用任意高精度不是人们计算常数的方式。您可以编写一些以智能方式利用磁盘空间的程序(例如,计算RAM中的一组数字并将这些数字写入文本文件),但决不能仅使用RAM/swap,因为这将始终限制您的结果。用现代算法计算pi,你不需要无限的RAM,你只需要在机器里放一个4TB的硬盘,让它写下接下来的数字。到目前为止,关于数学常数

现在谈谈物理常数:它们并不精确。他们依靠测量。我不太确定atm(将被编辑),但我认为最精确的物理常数的误差为10**(-8)。用更精确的方法计算,并不能使它更精确,你只是计算了更多错误的数字


作为一个实验,这是一个有趣的想法,这就是为什么我甚至把答案放在第一位。

Decimal类的最大精度是设备内存的函数,因此没有好的方法将其设置为一般情况。基本上,您将机器上的所有内存分配给一个变量,以获得最大精度

如果数学运算支持它,长整数将为您提供无限精度。但是,您仅限于整数

加法、减法、乘法和简单指数可以使用长整数精确执行

在Python 3之前,内置的
long
数据类型将执行任意精度计算。

在Python>=3中,
int
数据类型现在表示长整数。

64位整数数学的一个例子是bitcond实现,其中事务计算需要精确的值。然而,比特币交易的精度仅限于1“Satoshi”;每个比特币定义为10^8(整数)Satoshi


Decimal类在引擎盖下的工作方式类似。十进制精度为10^-8类似于比特币Satoshi范式。

尝试这样做是错误的。对新加入浮点运算的人来说,在一个问题上抛出更高的精度是一个诱人的陷阱,但它并没有那么有用,尤其是在这种极端情况下

您的操作实际上并不需要“最大可能”的精度,即使这是一个定义良好的概念。要么它们需要精确的算术运算,在这种情况下,
decimal.decimal
是完全错误的工具,您应该研究类似于
fracts.fracts
或符号计算的东西,要么它们不需要那么高的精度,您应该确定实际需要的精度并使用它

如果你仍然想对你的问题尽可能地精确,那么精确到什么程度将取决于你在做什么样的数学,以及你试图同时在内存中存储多少荒谬的精确数字。这可以通过分析您的程序和
Decimal
对象的内存需求来确定,或者您可以将精度作为一个参数,并进行二进制搜索,以获得不会导致崩溃的最大精度。

从上面的回复中:

如果我只是想在pi中找到比已经找到的更多的数字呢?如果我想测试e或米尔常数的非理性呢

我明白了。我真的喜欢。我的,几年前,是关于Python的任意精度浮点库的。如果这些是您想要生成的数值表示的类型,请做好深入研究的准备。十进制/FP算术是计算机科学中的一门学科

有些程序员在遇到问题时会想:“我知道,我会使用浮点运算。”现在他们有1.9999999997个问题

我认为,当其他人说在给定平台上,想知道Python十进制类型的最大精度是多少是一个“错误”或“取决于”时,他们对你的问题的理解比我猜想的更为直截了当。您询问了Python十进制类型,但如果出于教育目的对FP算术感兴趣——“在pi中查找更多数字”——您将需要比or更强大、更灵活的工具。这些内置的Python类型甚至不接近。这些可能对NASA来说已经足够好了,但它们有局限性。。。事实上,正是你所问的限制

这就是多重精度(或)
>>> find_optimum(int(1e9), int(1e11), 10)
0
fail
50500000000
1
no fail
25750000000
2
no fail
38125000000
3
no fail
44312500000
4
fail
47406250000
5
fail
45859375000
6
no fail
45085937500
7
no fail
45472656250
8
no fail
45666015625
9
no fail
45762695312