samhao 发表于 2022-1-3 19:59:31

为什么用pycharm算自然对数E的时候,x等于15个9和x等于14个9差这么多?

当我用pycharm算自然对数的时候

我写了

x =999999999999
E = (1+(1/x))**x

print(E)

结果发现如果9的数量如果在14个以内的时候,都接近2.71,
但是当9的数量在15个的时候,就会突然跳到3.0350352065492587



请问这是为什么呢?

傻眼貓咪 发表于 2022-1-3 19:59:32

这不是只有 Python 会这样,正确来说应该是程序语言对于浮点数是弱项,以下为 C 语言范例:#include <stdio.h>
#include <math.h>

int main(){
   
    double x = 99999999999999;// 14 个 9
    double y = 999999999999999; // 15 个 9
   
    double a = pow(1+1/x, x);
    double b = pow(1+1/y, y);
   
    printf("a: %lf\n", a);
    printf("b: %lf\n", b);

    return 0;
}结果和 Python 相同:a: 2.716110
b: 3.035035
因为乘方返回类型是浮点类型,所以相对太大就会影响其精准度:x = 999999999999999
print(type((1+(1/x))**x))<class 'float'>
浮点数采用 IEEE 754 标准规定
其储存方式分三个部分:
1.)数符(表示数值正负)
2.)阶码
3.)尾数
因为长度大小关系(分给三个部分),其精准变得有限。Python 的内置模块 decimal 可以用于加长其长度,提高一定的精准度

samhao 发表于 2022-1-3 20:00:27

截图如下

kogawananari 发表于 2022-1-3 20:15:44

from decimal import *

x = 99999999999999999
E = (1 + Decimal(1/x))**x

print(E)

suchocolate 发表于 2022-1-3 20:21:36

参考:https://blog.csdn.net/adorable_/article/details/109577331
>>>x=1.1
>>>y=1
>>>x-y
0.10000000000000009



>>> import decimal
>>> x = decimal.Decimal('999999999999999')
>>> e = (1+1/x)**x
>>> print(e)
2.718281828459041157937544783

傻眼貓咪 发表于 2022-1-3 20:41:04

楼主的意思应该不是想算出 15 个 9 真正答案,而是想知道为什么会这样吧
页: [1]
查看完整版本: 为什么用pycharm算自然对数E的时候,x等于15个9和x等于14个9差这么多?