Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中提高数百位小数的精度_Python_Python 3.x_Precision - Fatal编程技术网

如何在Python中提高数百位小数的精度

如何在Python中提高数百位小数的精度,python,python-3.x,precision,Python,Python 3.x,Precision,我需要计算在非常低的温度下的本征载流子浓度,这需要非常小的值(低至10-678),通过Python四舍五入到0。您建议我如何提高精度?两个选项: 用对数表示法工作。因此,您不是直接存储x,而是存储log10(x)。因此,在本例中,您将存储-678。这使乘法成为一种选择,但加法变得不可能 使用,并将精度设置为所需级别 >>从十进制导入十进制,getcontext >>>getcontext().prec=10000 >>>十进制(10)**-678 十进制('1E-678') 两个选项: 用对

我需要计算在非常低的温度下的本征载流子浓度,这需要非常小的值(低至10-678),通过Python四舍五入到0。您建议我如何提高精度?

两个选项:

  • 用对数表示法工作。因此,您不是直接存储
    x
    ,而是存储
    log10(x)
    。因此,在本例中,您将存储
    -678
    。这使乘法成为一种选择,但加法变得不可能

  • 使用,并将精度设置为所需级别

  • >>从十进制导入十进制,getcontext
    >>>getcontext().prec=10000
    >>>十进制(10)**-678
    十进制('1E-678')
    
    两个选项:

  • 用对数表示法工作。因此,您不是直接存储
    x
    ,而是存储
    log10(x)
    。因此,在本例中,您将存储
    -678
    。这使乘法成为一种选择,但加法变得不可能

  • 使用,并将精度设置为所需级别

  • >>从十进制导入十进制,getcontext
    >>>getcontext().prec=10000
    >>>十进制(10)**-678
    十进制('1E-678')
    
    Python对您可以达到的精度有内在限制吗(可能是32位到64位版本的Python?),或者这受到操作系统的限制,或者根本没有这种限制?@BramVanroy在我的机器上
    decimal.MAX_PREC
    99999999999999999
    ,这是很多精确的数字:)谢谢你的回复!不幸的是,我已经尝试了你的建议,但我仍然在[50]中得到了0:从decimal导入decimal,从[51]:getcontext()中得到getcontext。prec=10000 In[52]:decimal(10**-678)Out[52]:decimal('0')。Sarah你可能搞砸了。确保直接将数据加载到一个
    Decimal
    中,而不是首先将其作为
    float
    加载@Sarah是的,你搞砸了。看看你执行的和我执行的之间的区别。在进行任何操作之前,您首先必须确保您在“十进制范围”内工作。您首先在“float land”中执行
    10**-678
    ,然后将其转换为
    Decimal
    ——但是它的负载太大,已经四舍五入了。在Python中,您可以达到的精度是否有内在的限制(可能在32位到64位版本的Python之间?),或者这是受操作系统限制的?或者可能根本没有这样的限制?@BramVanroy在我的机器上
    十进制。MAX_PREC
    9999999999999
    ,所以这是很多精度的数字:)谢谢你的回复!不幸的是,我已经尝试了你的建议,但我仍然在[50]中得到了0:从decimal导入decimal,从[51]:getcontext()中得到getcontext。prec=10000 In[52]:decimal(10**-678)Out[52]:decimal('0')。Sarah你可能搞砸了。确保直接将数据加载到一个
    Decimal
    中,而不是首先将其作为
    float
    加载@Sarah是的,你搞砸了。看看你执行的和我执行的之间的区别。在进行任何操作之前,您首先必须确保您在“十进制范围”内工作。您首先在“浮动区域”中执行
    10**-678
    ,然后将其转换为
    Decimal
    ——但是它太重了,已经四舍五入了。为什么不上传您编写的代码呢?如果有一个更好的问题,为什么不上传到目前为止编写的代码呢?如果有一个