鱼C论坛

 找回密码
 立即注册
查看: 2542|回复: 11

[已解决]python用递归函数和正常输出相比,少了一位小数

[复制链接]
发表于 2020-4-26 16:55:09 | 显示全部楼层 |阅读模式

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

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

x
def chengjie1(n):
    sum=0;
    if n==1:
        sum=sum+(1/ (n * (n + 1)))
        return  sum
    else:
        sum=(1/ (n * (n + 1))+chengjie1(n-1))
        return sum
print(chengjie1(12))
print(12/13)

结果如下:
0.923076923076923   这个是递归的。
0.9230769230769231  这个是正常输出的。
最佳答案
2020-4-26 17:25:45
Otteel 发表于 2020-4-26 17:20
这个能解决吗?

解决不了,这是计算机存储问题
计算机是以二进制进行存储的,数据存储过程中基本都有精度损失。有效位数是15位,之后的就不精确了。
只有少数是没有精度损失的,例如0.5,0.125,0.625等能够用2完整分割的小数一般是没有精度损失的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-4-26 16:58:15 | 显示全部楼层
这个是什么问题,
输出print(chengjie1(14))
print(14/15)
结果如下0.9333333333333332用递归
0.9333333333333333没用递归
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 17:18:21 | 显示全部楼层
这个仅仅是运算精度问题。15位有效数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 17:20:17 | 显示全部楼层
sunrise085 发表于 2020-4-26 17:18
这个仅仅是运算精度问题。15位有效数字

这个能解决吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 17:20:37 | 显示全部楼层
运算精度的问题,可以忽略
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 17:21:23 | 显示全部楼层
sunrise085 发表于 2020-4-26 17:18
这个仅仅是运算精度问题。15位有效数字

while循环和递归函数的精度是不是一样的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 17:21:36 | 显示全部楼层
除不尽的数你没有考虑进去吧。
无理数和无限循环小数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 17:24:22 | 显示全部楼层
zltzlt 发表于 2020-4-26 17:20
运算精度的问题,可以忽略

0.9899999999999997 这个是递归
0.99 这个是while循环的
他们精度不一样的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 17:25:37 | 显示全部楼层
zltzlt 发表于 2020-4-26 17:20
运算精度的问题,可以忽略

主要是递归函数那个值越大,离标准答案的值就越不准确,这个不能解决吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 17:25:45 | 显示全部楼层    本楼为最佳答案   
Otteel 发表于 2020-4-26 17:20
这个能解决吗?

解决不了,这是计算机存储问题
计算机是以二进制进行存储的,数据存储过程中基本都有精度损失。有效位数是15位,之后的就不精确了。
只有少数是没有精度损失的,例如0.5,0.125,0.625等能够用2完整分割的小数一般是没有精度损失的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-4-26 17:27:35 | 显示全部楼层
Otteel 发表于 2020-4-26 17:24
0.9899999999999997 这个是递归
0.99 这个是while循环的
他们精度不一样的吗?

这是编程语言共存的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-26 17:59:07 | 显示全部楼层
sunrise085 发表于 2020-4-26 17:25
解决不了,这是计算机存储问题
计算机是以二进制进行存储的,数据存储过程中基本都有精度损失。有效位数 ...

为什么循环是16位,而递归是15位呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 09:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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