鱼C论坛

 找回密码
 立即注册
查看: 1279|回复: 5

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

[复制链接]
发表于 2022-1-3 19:59:31 | 显示全部楼层 |阅读模式
20鱼币
当我用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 语言范例:
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(){
  4.    
  5.     double x = 99999999999999;  // 14 个 9
  6.     double y = 999999999999999; // 15 个 9
  7.    
  8.     double a = pow(1+1/x, x);
  9.     double b = pow(1+1/y, y);
  10.    
  11.     printf("a: %lf\n", a);
  12.     printf("b: %lf\n", b);

  13.     return 0;
  14. }
复制代码
结果和 Python 相同:
  1. a: 2.716110
  2. b: 3.035035
复制代码

因为乘方返回类型是浮点类型,所以相对太大就会影响其精准度:
  1. x = 999999999999999
  2. print(type((1+(1/x))**x))
复制代码
  1. <class 'float'>
复制代码

浮点数采用 IEEE 754 标准规定
其储存方式分三个部分:
1.)数符(表示数值正负)
2.)阶码
3.)尾数
因为长度大小关系(分给三个部分),其精准变得有限。Python 的内置模块 decimal 可以用于加长其长度,提高一定的精准度

最佳答案

查看完整内容

这不是只有 Python 会这样,正确来说应该是程序语言对于浮点数是弱项,以下为 C 语言范例:结果和 Python 相同: 因为乘方返回类型是浮点类型,所以相对太大就会影响其精准度: 浮点数采用 IEEE 754 标准规定 其储存方式分三个部分: 1.)数符(表示数值正负) 2.)阶码 3.)尾数 因为长度大小关系(分给三个部分),其精准变得有限。Python 的内置模块 decimal 可以用于加长其长度,提高一定的精准度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-3 19:59:32 | 显示全部楼层    本楼为最佳答案   
这不是只有 Python 会这样,正确来说应该是程序语言对于浮点数是弱项,以下为 C 语言范例:
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(){
  4.    
  5.     double x = 99999999999999;  // 14 个 9
  6.     double y = 999999999999999; // 15 个 9
  7.    
  8.     double a = pow(1+1/x, x);
  9.     double b = pow(1+1/y, y);
  10.    
  11.     printf("a: %lf\n", a);
  12.     printf("b: %lf\n", b);

  13.     return 0;
  14. }
复制代码
结果和 Python 相同:
  1. a: 2.716110
  2. b: 3.035035
复制代码

因为乘方返回类型是浮点类型,所以相对太大就会影响其精准度:
  1. x = 999999999999999
  2. print(type((1+(1/x))**x))
复制代码
  1. <class 'float'>
复制代码

浮点数采用 IEEE 754 标准规定
其储存方式分三个部分:
1.)数符(表示数值正负)
2.)阶码
3.)尾数
因为长度大小关系(分给三个部分),其精准变得有限。Python 的内置模块 decimal 可以用于加长其长度,提高一定的精准度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-3 20:00:27 | 显示全部楼层
截图如下
微信截图_20220103183428.png
微信截图_20220103183502.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-3 20:15:44 | 显示全部楼层
from decimal import *

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

print(E)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-3 20:21:36 | 显示全部楼层
参考:https://blog.csdn.net/adorable_/article/details/109577331
  1. >>>x=1.1
  2. >>>y=1
  3. >>>x-y
  4. 0.10000000000000009

复制代码

  1. >>> import decimal
  2. >>> x = decimal.Decimal('999999999999999')
  3. >>> e = (1+1/x)**x
  4. >>> print(e)
  5. 2.718281828459041157937544783
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-3 20:41:04 | 显示全部楼层
楼主的意思应该不是想算出 15 个 9 真正答案,而是想知道为什么会这样吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-13 06:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表