实数精度问题汇总

实数判等(原因见2) 不可直接if(x==y)判断。 用if (fabs(x-y)<esp)来判断,esp通常取1e-8或更小。 底函数(取整) 实数不一定能精确的表示,比如2.98,实际上可能被存成2.9799…..这是由于有限位的十进制数不一定用有限位的二进制数表示。 所以取整可能会出大问题,比如理想值为3,而实际值是2.999…,那么取整后会是2而不是3。 但是,可以知道的是,实际值一定不会大于理想值,比如2.98实际是2.97999…,而不会是2.9900….。所以可以通过floor(esp+x)的方式取整。 四舍五入的方法 直接floor(x+0.5),可

两个诡异的编程错误分析

这是我在Coding过程中遇到过的两种极其诡异的错误,在这里说一下,顺便分享解决方案。 错误一: Debug单步执行完全正确,但是直接Run的话结果就是不正确。 原因: 没有正确的为变量赋初始值,所以Run的时候会出错。但是Debug的时候会自动给你赋初始值,所以单步执行结果正确。 示例代码: bool *prime=new bool[(n+1>>1)-1]; memset(prime,true,sizeof(prime)); //…… //…… 分析: prime是动态分配的,所以sizeof算符并不能正确的得到prime的大小。 正确写法: bool *prim