鱼C论坛

 找回密码
 立即注册
查看: 3109|回复: 10

[已解决]关于每日一题203,我的代码结果有错,求查错

[复制链接]
发表于 2018-9-4 16:50:25 | 显示全部楼层 |阅读模式

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

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

x
先把原题贴上来
javascript:;
  1. # 我的代码
  2. def func203(n):
  3.     if n<1:
  4.         print("只能输入正数啦")
  5.         return func203(int(input("请输入正整数n:")))
  6.     result=n
  7.     while n>1:
  8.         result=1/result+n-1
  9.         n-=1
  10.     print(result)

  11. while True:
  12.     try:
  13.         a=func203(int(input("请输入正整数n:")))
  14.     except:
  15.         print("输入的不是整型哦")
  16.     else:
  17.         break
复制代码

结果与答案有细微的差异,例如n=4时,最后一位是6
最佳答案
2018-9-5 17:17:16
FC的注册很坑 发表于 2018-9-5 16:48
还是没有想明白
我纠结的点在,为什么加上两个整型和加一个整型的结果不一样?
因为这么短的整 ...
  1. >>> 13/30
  2. 0.43333333333333335
  3. >>> 13/30 + 1    #最后一位小数也变了,说明 1.0 != 1
  4. 1.4333333333333333
  5. >>> 13/30 + 2 - 1
  6. 1.4333333333333336
  7. >>> 13/30 + 2
  8. 2.4333333333333336
  9. >>> 13/30 + 2.0 - 1.0
  10. 1.4333333333333336
  11. >>> 13/30 + (2.0 - 1.0)    # 是不是浮点数,很重要吗?
  12. 1.4333333333333333
复制代码

在 6 楼的时候就说了,你希望的是每一次循环的时候,加上一个整数(我没有说是整型
简单的 1.0 跟 1 都会有误差,但是 2.0 跟 1.0 的浮点误差是一样的,所以抵消了
浮点数是【整数】+【小数】
你要如何消除这个误差?就是确保每一次 n - 1 是整数,最好的是先维持它们整型之间的运算
捕获.JPG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-4 17:39:00 | 显示全部楼层
def func203(n):
    result = n
    while n > 1:
        result = 1/result + (n - 1)  #先乘除后加减
        n -= 1
    return result
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 20:22:25 | 显示全部楼层
claws0n 发表于 2018-9-4 17:39
def func203(n):
    result = n
    while n > 1:

真的加个括号就结果对了,但是为什么呢?能解释一下吗,谢谢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 22:45:33 | 显示全部楼层
FC的注册很坑 发表于 2018-9-4 20:22
真的加个括号就结果对了,但是为什么呢?能解释一下吗,谢谢?

你要的是分数 + 整数。但是按照你目前的做法,会是浮点数 + 整数,等于浮点数之后,再浮点数 - 整数。最终的结果是累加误差导致。典型的 error propagation
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-9-5 09:36:56 | 显示全部楼层
claws0n 发表于 2018-9-4 22:45
你要的是分数 + 整数。但是按照你目前的做法,会是浮点数 + 整数,等于浮点数之后,再浮点数 - 整数。最 ...

理解了浮点数在用于分数表达时的精度问题,但还是不理解为什么加个括号就对了?或者不加括号,换个顺序,改成result =n-1+ 1/result ,结果也是正确的?无论是加括号还是换顺序,都还是浮点和整型相加啊,输出还是浮点啊?为什么这个就没误差了呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 10:59:48 | 显示全部楼层
FC的注册很坑 发表于 2018-9-5 09:36
理解了浮点数在用于分数表达时的精度问题,但还是不理解为什么加个括号就对了?或者不加括号,换个顺序, ...

你希望每一次是相加一个递减整数,而不是相加一个递减浮点数
a - b + c  ,运算的顺序是从左到右,所以保证了 a-b 为整数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 13:49:16 | 显示全部楼层
claws0n 发表于 2018-9-5 10:59
你希望每一次是相加一个递减整数,而不是相加一个递减浮点数
a - b + c  ,运算的顺序是从左到右,所以 ...

浮点数与整数的运算,不是会将整数先编译为浮点数,再运算输出一个浮点数吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 13:53:38 | 显示全部楼层
FC的注册很坑 发表于 2018-9-5 13:49
浮点数与整数的运算,不是会将整数先编译为浮点数,再运算输出一个浮点数吗?

重点是你是要 + 4 …… +3 …… +2
但是如果分开处理,会是 + 3.x ……+ 2.x ……+ 1.x
你的结果没有差多少,是小数第 8第9开始的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 14:26:44 | 显示全部楼层
FC的注册很坑 发表于 2018-9-5 13:49
浮点数与整数的运算,不是会将整数先编译为浮点数,再运算输出一个浮点数吗?

误差是第 16 位小数开始
1.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-5 16:48:38 | 显示全部楼层
claws0n 发表于 2018-9-5 13:53
重点是你是要 + 4 …… +3 …… +2
但是如果分开处理,会是 + 3.x ……+ 2.x ……+ 1.x
你的结果没有 ...

还是没有想明白
我纠结的点在,为什么加上两个整型和加一个整型的结果不一样?
因为这么短的整数,转换成浮点数是没有精度误差的,所以为什么不是加多少次都一样呢?
如果后面加的是小数,那么我能理解加一个小数和两个小数,结果可能会有区别,但是加减的都是整数啊,我就想不明白了
我直接打印了n=4的最后一步
  1. print(13/30+1)
  2. print(13/30+2-1)
复制代码

结果是不一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-5 17:17:16 | 显示全部楼层    本楼为最佳答案   
FC的注册很坑 发表于 2018-9-5 16:48
还是没有想明白
我纠结的点在,为什么加上两个整型和加一个整型的结果不一样?
因为这么短的整 ...
  1. >>> 13/30
  2. 0.43333333333333335
  3. >>> 13/30 + 1    #最后一位小数也变了,说明 1.0 != 1
  4. 1.4333333333333333
  5. >>> 13/30 + 2 - 1
  6. 1.4333333333333336
  7. >>> 13/30 + 2
  8. 2.4333333333333336
  9. >>> 13/30 + 2.0 - 1.0
  10. 1.4333333333333336
  11. >>> 13/30 + (2.0 - 1.0)    # 是不是浮点数,很重要吗?
  12. 1.4333333333333333
复制代码

在 6 楼的时候就说了,你希望的是每一次循环的时候,加上一个整数(我没有说是整型
简单的 1.0 跟 1 都会有误差,但是 2.0 跟 1.0 的浮点误差是一样的,所以抵消了
浮点数是【整数】+【小数】
你要如何消除这个误差?就是确保每一次 n - 1 是整数,最好的是先维持它们整型之间的运算
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-5 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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