ACM浮点数相关的陷阱
误差修正
因为被计算机表示浮点数的方式所限制,CPU在进行浮点数计算时会出现误差。如执行0.1 + 0.2 == 0.3
结果往往为false
,在四则运算中,加减法对精度的影响较小,而乘法对精度的影响更大,除法的对精度的影响最大。所以,在设计算法时,为了提高最终结果的精度,要尽量减少计算的数量,尤其是乘法和除法的数量。
浮点数与浮点数之间不能直接比较,要引入一个eps
常量。eps
是epsilon()的简写,在数学中往往代表任意小的量。在对浮点数进行大小比较时,如果他们的差的绝对值小于这个量,那么我们就认为他们是相等的,从而避免了浮点数精度误差对浮点数比较的影响。eps在大部分题目时取1e-8
就够了,但要根据题目实际的内容进行调整。
模板代码
// sgn返回x经过eps处理的符号,负数返回-1,正数返回1,x的绝对值如果足够小,就返回0。
const double eps = 1e-8;
int sgn(double x) { return x < -eps ? -1 : x > eps ? 1 : 0; }
整型比较 | 等价的浮点数比较 |
---|---|
a == b |
sgn(a - b) == 0 |
a > b |
sgn(a - b) > 0 |
a >= b |
sgn(a - b) >= 0 |
a < b |
sgn(a - b) < 0 |
a <= b |
sgn(a - b) <= 0 |
a != b |
sgn(a - b) != 0 |
输入输出
用scanf
输入浮点数时,double
的占位符是%lf
,但是浮点数double
在printf
系列函数中的标准占位符是%f
而不是%lf
,使用时最好使用前者,因为虽然后者在大部分的计算机和编译器中能得到正确结果,但在有些情况下会出错(比如在POJ上)。
开方
当提供给C语言中的标准库函数double sqrt (double x)
的x
为负值时,sqrt
会返回nan
,输出时会显示成nan
或-1.#IND00
(根据系统的不同)。在进行计算几何编程时,经常有对接近零的数进行开方的情况,如果输入的数是一个极小的负数,那么sqrt
会返回nan
这个错误的结果,导致输出错误。解决的方法就是将sqrt
包装一下,在每次开方前进行判断。
示例代码
double mysqrt(double x) { return max(0.0, sqrt(x)); }
负零
大部分的标程的输出是不会输出负零的,如下面这段程序:
int main() {
printf("%.2f\n", -0.0000000001);
return 0;
}
会输出-0.00
。有时这样的结果是错误的,所以在没有Special Judge的题目要求四舍五入时,不要忘记对负零进行特殊判断。
但有的标程也不会进行这样的特殊判断,所以在WA时不要放弃摸索。
最新文章
- 执行mvn 报错 source-1.5 中不支持 diamond运算符
- [翻译] Autofac 入门文档
- VB中 ByRef与ByVal区别
- sublime问题汇总
- AndroidStudio Lod.d在LogCat中不输出
- subline 快捷键
- 下载abap 源代码
- Java compiler level does not match the version of the installed Java project facet.	springmvc1 和 Target runtime Apache Tomcat v7.0 is not defined.
- jquery-pager分页
- Store update, insert, or delete statement affected an unexpected number of rows ({0}).
- 迷宫问题python实现(靠右手摸墙)
- ECMAScript 6 笔记(二)
- 如何优化Spring Cloud微服务注册中心架构?
- 从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域
- .apply()用法和call()的区别
- 树莓派3中安装JDK
- jmeter随笔(31)--RandomString和Random函数使用
- Java 中编程的格式
- InnoDB引擎,从大表中删除多行
- P3698 [CQOI2017]小Q的棋盘
热门文章
- ROS naviagtion analysis: costmap_2d--ObstacleLayer
- c语言实战 BJT时间转化位UTC时间
- js原型链prototype与__proto__以及new表达式
- - Unknown tag (c:set).
- Vue 兄弟组件通过事件广播传递数据
- 「TJOI2013」攻击装置
- kubernetes api文档
- 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA
- 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)
- 「BZOJ1433」[ZJOI2009] 假期的宿舍(二分图,网络流)