第二次实验:理解浮点数运算的误差+chapter 1
一、实验目的:
(1)理解组合数定义式的化简。
(2)理解运算符/和//的区别,理解运算符//的原理。
(3)理解浮点数运算的误差和可能带来的问题。
(4)熟悉函数定义与使用。
(5)熟悉循环结构。
二、实验内容:
阅读并适当增加必要的代码来调试下面的代码,分析代码功能,发现并解决代码中的错误。
# //运算符 源代码
# 提示:这段代码试图计算组合数Ci n,但是由于浮点数除法时精度问题导致结果错误
# C2 5 = 10,但是以下代码计算C2 5的结果是8(cni(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
回答:
问题出在使用整数除法//,在计算过程中,当执行result * (n-j) // (minNI-j)
时,由于整数除法会直接舍去小数部分,可能导致结果不准确。
以计算 cni(5,2)为例,当 j = 0
时,result = 5 // 2 = 2
(这里应该是 5/2 = 2.5,但整数除法直接得到 2)。接着,当 j = 1
时,result = result * (n-j) // (minNI-j) = 2 * 4 // 1 = 8
。而正确的计算过程应该是 5 * 4/2 = 10
。
解决:
代码如下:
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
cni(5,2)
结果为10.0