鱼C论坛

 找回密码
 立即注册
查看: 2125|回复: 13

[已解决]用for做小数的加法,为什么会算不对?我从-2开始循环每次加0.04,出现-1.839999999...

[复制链接]
发表于 2018-9-12 15:45:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 id是什么 于 2018-9-12 15:47 编辑

本来想算一道微积分的题目.....结果发现算不对,一查是for循环算不精确……
def f(x):
        return 1/2*(4-x**2)**(1/2)

for i in range(0,100000):
        n = 4/100000
        t += n
        value += f(t)*n

结果出现复数了………………
正确答案应该是pai的

我一查,t循环着循环着就没算对,我不理解为什么会算错?
---
下面是循环一百次的:

for i in range(0,100):
        n = 4/100
        t += n
        print(n,t)

       
0.04 -1.96
0.04 -1.92
0.04 -1.88
0.04 -1.8399999999999999
0.04 -1.7999999999999998
0.04 -1.7599999999999998
0.04 -1.7199999999999998
0.04 -1.6799999999999997
0.04 -1.6399999999999997
0.04 -1.5999999999999996
0.04 -1.5599999999999996
0.04 -1.5199999999999996
0.04 -1.4799999999999995
0.04 -1.4399999999999995
0.04 -1.3999999999999995
0.04 -1.3599999999999994
0.04 -1.3199999999999994
0.04 -1.2799999999999994
0.04 -1.2399999999999993
0.04 -1.1999999999999993
0.04 -1.1599999999999993
0.04 -1.1199999999999992
0.04 -1.0799999999999992
0.04 -1.0399999999999991
0.04 -0.9999999999999991
0.04 -0.9599999999999991
0.04 -0.919999999999999
0.04 -0.879999999999999
0.04 -0.839999999999999
0.04 -0.7999999999999989
0.04 -0.7599999999999989
0.04 -0.7199999999999989
0.04 -0.6799999999999988
0.04 -0.6399999999999988
0.04 -0.5999999999999988
0.04 -0.5599999999999987
0.04 -0.5199999999999987
0.04 -0.4799999999999987
0.04 -0.4399999999999987
0.04 -0.39999999999999875
0.04 -0.35999999999999877
0.04 -0.3199999999999988
0.04 -0.2799999999999988
0.04 -0.2399999999999988
0.04 -0.1999999999999988
0.04 -0.15999999999999878
0.04 -0.11999999999999877
0.04 -0.07999999999999877
0.04 -0.039999999999998766
0.04 1.2351231148954867e-15
0.04 0.040000000000001236
0.04 0.08000000000000124
0.04 0.12000000000000124
0.04 0.16000000000000125
0.04 0.20000000000000126
0.04 0.24000000000000127
0.04 0.28000000000000125
0.04 0.32000000000000123
0.04 0.3600000000000012
0.04 0.4000000000000012
0.04 0.44000000000000117
0.04 0.48000000000000115
0.04 0.5200000000000011
0.04 0.5600000000000012
0.04 0.6000000000000012
0.04 0.6400000000000012
0.04 0.6800000000000013
0.04 0.7200000000000013
0.04 0.7600000000000013
0.04 0.8000000000000014
0.04 0.8400000000000014
0.04 0.8800000000000014
0.04 0.9200000000000015
0.04 0.9600000000000015
0.04 1.0000000000000016
0.04 1.0400000000000016
0.04 1.0800000000000016
0.04 1.1200000000000017
0.04 1.1600000000000017
0.04 1.2000000000000017
0.04 1.2400000000000018
0.04 1.2800000000000018
0.04 1.3200000000000018
0.04 1.3600000000000019
0.04 1.400000000000002
0.04 1.440000000000002
0.04 1.480000000000002
0.04 1.520000000000002
0.04 1.560000000000002
0.04 1.600000000000002
0.04 1.6400000000000021
0.04 1.6800000000000022
0.04 1.7200000000000022
0.04 1.7600000000000022
0.04 1.8000000000000023
0.04 1.8400000000000023
0.04 1.8800000000000023
0.04 1.9200000000000024
0.04 1.9600000000000024
0.04 2.000000000000002
最佳答案
2018-9-12 16:38:36
round可以用一下
  1. def f(x):
  2.         return 1/2*(4-x**2)**(1/2)
  3. t=-2
  4. value=0
  5. for i in range(0,10**5):
  6.         n = 4/10**5
  7.         t += n
  8.         t=round(t,5)
  9.         value += f(t)*n
  10. print(value)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-12 15:54:01 | 显示全部楼层
小数计算有精度的,你是想表达-2到+2中间采样点不准么
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 15:57:32 | 显示全部楼层
def f(x):
        return 1/2*(4-x**2)**(1/2)  #为什么要0.5?

问题:n = 4/100000  #查了你的数学式,好像说什么定义域在[-2,2] 而已

左看右看都不像是什么积分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 15:58:46 | 显示全部楼层
最后取到2.000000000000002,当然会出现复数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 15:59:46 | 显示全部楼层
claws0n 发表于 2018-9-12 15:57
def f(x):
        return 1/2*(4-x**2)**(1/2)  #为什么要0.5?

是个2半径的圆方程-2到2的积分的一半
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 16:04:36 | 显示全部楼层
塔利班 发表于 2018-9-12 15:59
是个2半径的圆方程-2到2的积分的一半

好深奥~
不过楼主说答案是 pi,应该是这样
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 16:05:45 | 显示全部楼层
claws0n 发表于 2018-9-12 16:04
好深奥~
不过楼主说答案是 pi,应该是这样

偶函数一回事
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-12 16:10:48 | 显示全部楼层
claws0n 发表于 2018-9-12 15:57
def f(x):
        return 1/2*(4-x**2)**(1/2)  #为什么要0.5?


                               
登录/注册后可看大图

向算开根,题目在这里,前面部分是奇函数,可以忽略
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-12 16:12:48 | 显示全部楼层
塔利班 发表于 2018-9-12 15:58
最后取到2.000000000000002,当然会出现复数

我就是不理解,为什么会末位数有误差呢(我觉得不是我的问题,我放上来的那一段,间隔是0.04,不该出现小数点后面后十几位)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 16:13:02 | 显示全部楼层
id是什么 发表于 2018-9-12 16:10
向算开根,题目在这里,前面部分是奇函数,可以忽略

这还用Python吗。。白给的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-12 16:13:49 | 显示全部楼层
塔利班 发表于 2018-9-12 16:13
这还用Python吗。。白给的

我现在数学上会算了……
但我不知道为什么python不能算啊……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 16:14:39 | 显示全部楼层
id是什么 发表于 2018-9-12 16:12
我就是不理解,为什么会末位数有误差呢(我觉得不是我的问题,我放上来的那一段,间隔是0.04,不该出现小 ...

很简单。计算机都是二进制存储数据的。你的十进制放到二进制可能除不尽,所以用比较接近的数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 16:21:01 | 显示全部楼层
id是什么 发表于 2018-9-12 16:13
我现在数学上会算了……
但我不知道为什么python不能算啊……
  1. def f(x):
  2.     return (4-x**2)**0.5

  3. def jifen(f,a,b,n):
  4.     h = float(b-a)/n
  5.     s = 0.5*(f(a) + f(b))
  6.     for i in range(1,n):
  7.         s = s + f(a + i*h)
  8.     return s*h

  9. print(jifen(f,0,2,10000))

  10. >>> 3.1415914776113207
复制代码
都说了,不像什么积分
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 16:38:36 | 显示全部楼层    本楼为最佳答案   
round可以用一下
  1. def f(x):
  2.         return 1/2*(4-x**2)**(1/2)
  3. t=-2
  4. value=0
  5. for i in range(0,10**5):
  6.         n = 4/10**5
  7.         t += n
  8.         t=round(t,5)
  9.         value += f(t)*n
  10. print(value)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-1 13:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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