什么是浮点/舍入错误的简单例子?

我在使用浮点变量时听说过“错误”。 现在我试图解决这个难题,我想我得到一些舍入/浮点错误。 所以我最终要弄清浮点错误的基础知识。

什么是浮点/舍入错误的简单例子(最好在C ++中)?

编辑:例如,说我有一个事件,其概率p成功。 我做这个事件10次(p不改变,所有的试验都是独立的)。 完全2次成功试验的概率是多少? 我有这样的编码为:

double p_2x_success = pow(1-p, (double)8) * pow(p, (double)2) * (double)choose(8, 2);

这是浮点错误的机会吗?


 for(double d = 0; d != 0.3; d += 0.1); // never terminates 

图片胜过千言万语 - 尝试绘制等式f(k)

你会得到这样的XY图(X和Y是对数刻度)。
在这里输入图像描述
如果计算机可以代表32位浮点数而没有舍入误差,那么对于每个k我们应该得到零。 但是,由于浮点错误累积,错误会随着更大的k值而增加。

心连心!


通常,浮点错误指的是何时不能存储在IEEE浮点表示中的数字。

整数存储在最右边的位为1,左边的每一位是(2,4,8,...)的两倍。 很容易看出,这可以存储任何高达2 ^ n的整数,其中n是位数。

浮点数的尾数(小数部分)以类似的方式存储,但是从左向右移动,并且每个连续位是前一个值的一半。 (这实际上比这更复杂一点,但现在会做)。

因此,像0.5(1/2)这样的数字很容易存储,但并不是每个数字<1都可以通过添加固定数目的1/2,1 / 4,1 / 8 ......

一个非常简单的例子是0.1或1/10。 这可以通过一个无限的系列来完成(我不能真的被困扰),但是每当一台电脑存储0.1时,这个数字就不是存储的。

如果你有权访问Unix机器,很容易看到这一点:

Python 2.5.1 (r251:54863, Apr 15 2008, 22:57:26) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>> 

无论你使用什么语言,你都会非常小心使用浮动和双打进行平等测试。

(就你的例子而言,0.2是另一个不能存储在IEEE二进制文件中的讨厌的数字,但只要你测试了不等式,而不是平等,就像p <= 0.2,那么你就没事了。)

链接地址: http://www.djcxy.com/p/21367.html

上一篇: What is a simple example of floating point/rounding error?

下一篇: Round to 2 decimal places