误差修正

因为被计算机表示浮点数的方式所限制,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,但是浮点数doubleprintf系列函数中的标准占位符是%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时不要放弃摸索。

最新文章

  1. 执行mvn 报错 source-1.5 中不支持 diamond运算符
  2. [翻译] Autofac 入门文档
  3. VB中 ByRef与ByVal区别
  4. sublime问题汇总
  5. AndroidStudio Lod.d在LogCat中不输出
  6. subline 快捷键
  7. 下载abap 源代码
  8. Java compiler level does not match the version of the installed Java project facet. springmvc1 和 Target runtime Apache Tomcat v7.0 is not defined.
  9. jquery-pager分页
  10. Store update, insert, or delete statement affected an unexpected number of rows ({0}).
  11. 迷宫问题python实现(靠右手摸墙)
  12. ECMAScript 6 笔记(二)
  13. 如何优化Spring Cloud微服务注册中心架构?
  14. 从零开始学 Web 之 Vue.js(四)Vue的Ajax请求和跨域
  15. .apply()用法和call()的区别
  16. 树莓派3中安装JDK
  17. jmeter随笔(31)--RandomString和Random函数使用
  18. Java 中编程的格式
  19. InnoDB引擎,从大表中删除多行
  20. P3698 [CQOI2017]小Q的棋盘

热门文章

  1. ROS naviagtion analysis: costmap_2d--ObstacleLayer
  2. c语言实战 BJT时间转化位UTC时间
  3. js原型链prototype与__proto__以及new表达式
  4. - Unknown tag (c:set).
  5. Vue 兄弟组件通过事件广播传递数据
  6. 「TJOI2013」攻击装置
  7. kubernetes api文档
  8. 【bzoj2330】: [SCOI2011]糖果 图论-差分约束-SPFA
  9. 类1(this指针/const成员函数/类作用域/外部成员函数/返回this对象的函数)
  10. 「BZOJ1433」[ZJOI2009] 假期的宿舍(二分图,网络流)