通过一个简单的 C 示例了解浮点错误
在编程领域,浮点变量由于其有限的精度可能会引入错误。这种现象称为浮点错误,在执行涉及此类变量的数学运算时可能会出现。
考虑以下 C 代码片段,它尝试计算 10 个独立事件序列中恰好两次成功的概率,其中每个事件都有成功的概率“p”:
double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);
变量“pow()”和“choose()”表示数学函数。
现在,让我们检查一下这段代码是否面临潜在的浮点错误。随着上式中'k'的值增加,项'pow(1-p, k)'和'choose(k, 2)'的量级将变得非常大。这可能会导致浮点错误累积,因为这些运算是在越来越大的数字上执行的。
为了形象化这一点,让我们绘制方程“f(k)”:
f(k) = pow(1-p, k) * pow(p, k) * choose(k, 2)
其中“X”和“Y”均采用对数刻度。
对于具有 32 位浮点表示的计算机,我们期望对于“k”的所有值,“f(k)”为零。然而,由于浮点误差,“k”值越大,误差就会显着增加。从下图可以看出这一点:
[具有对数刻度的 XY 图图像]
在此图中,X 轴代表“k”,Y 轴代表误差的绝对值。随着“k”的增加,误差累积变得更加明显。
因此,由于概率计算中舍入误差的累积,所提供的代码片段确实容易受到浮点错误的影响。
以上是为什么我的 C 概率计算会出现浮点错误?的详细内容。更多信息请关注PHP中文网其他相关文章!