Python实验课_理解浮点数运算的误差 + chapter 1

一、实验目的:

(1)理解组合数定义式的化简。

(2)理解运算符/和//的区别,理解运算符//的原理。

(3)理解浮点数运算的误差和可能带来的问题。

(4)熟悉函数定义与使用。

(5)熟悉循环结构。

二、实验内容:

阅读并适当增加必要的代码来调试下面的代码,分析代码功能,发现并解决代码中的错误。

# //运算符 源代码

# 提示:这段代码试图计算组合数Ci n,但是由于浮点数除法时精度问题导致结果错误

# C2 5 = 10,但是以下代码计算C2 5的结果是8cni(5, 2)),为什么?

def cni(n, i):

    minNI = min(i, n-i)

    result = 1

    for j in range(0, minNI):

        result = result * (n-j) // (minNI-j)

return result

三、实验环境:

Windows 10/11 + Jupyter Notebook \ PyCharm \ Spyder \ VScode + Python 3.x

四、实验内容与完成情况:

修改后运行代码如下:

def cni(n, i):

    minNI = min(i, n-i)

    result = 1

    for j in range(minNI):

        result = result * (n-j) / (j+1)

return result

输出结果:

n = 5

i = 2

print(cni(n, i))

五、出现的问题:

这两个代码主要是将除法将整除“\\”修改为“\”,属于整数型除法和浮点型除法之间算数的问题

六、解决方案:

将代码中\\修改为\即将整数型除法改为浮点型,例如整数型除法5\\2结果会是2,向下取整,而浮点型出发5\2结果会是2.5。所以在这段代码中,当 j 等于 minNI-1 时,分母 (minNI-j) 将变为 1,此时 (n-j) // 1 仍然是整数除法,没有问题。但是,当 j 从 0 增加到 minNI-2 时,分母 (minNI-j) 将是一个大于 1 的整数,此时 (n-j) // (minNI-j) 将执行整数除法,结果会向下取整,导致每次循环都可能因为精度问题导致结果变小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值