【算法学习】浮点数的比较宏 您所在的位置:网站首页 float比较大小c语言 【算法学习】浮点数的比较宏

【算法学习】浮点数的比较宏

2023-08-06 07:50| 来源: 网络整理| 查看: 265

文章目录 1. 等于2. 小于3. 小于等于4. 大于5. 大于等于6. 用小于实现其他运算符

计算机中的浮点数都有精度限制,并不总是精确的,甚至经过大量计算后也可能出现精度损失。这就会给比较运算带来极大困扰(尤其是在计算几何的题目中)。为此,我们总是需要引入一个极小的误差数 eps 来进行修正,经验表明 eps 取 1 0 − 8 10^{-8} 10−8 是一个比较合适的数字。

1. 等于

如下图,如果一个数 a 落在了 [b - eps, b + eps] 这一区间内,我们就应当判断 a == b 成立:

| a | ______|______|______|______ b-eps b b+eps

宏代码如下,将 a 和 b 相减,如果差的绝对值小于 eps 则返回 true ,否则返回 false 。有了等于,使用不等于就很简单了——调用 !equ(a, b) 即可。这样我们就可以在程序中对浮点数判等了:

const double eps = 1e-8; #define equ(a, b) ((fabs((a) - (b))) double a = 1.2223; printf(less(a, 1.2233) ? "true" : "false"); return 0; }

结果为 true 。

3. 小于等于

如下图,小于等于可以理解为小于和等于的结合,因此只要小于等于 b + eps 的数,都可以判断为小于等于 b 。

a | a | ______|______|______|______ b-eps b b+eps

宏代码如下,将 a 和 b 相减,如果差小于等于 eps 则有 a b + eps ,于是返回 true ,否则返回 false 。

#define greater(a, b) (((a) - (b)) > (eps))

示例代码如下:

#include #include const double eps = 1e-8; #define greater(a, b) (((a) - (b)) > (eps)) int main() { double a = 1.2223; printf(greater(a, 1.2221) ? "true" : "false"); return 0; }

结果为 true 。

5. 大于等于

如下图,大于等于可以理解为大于和等于的结合,因此只要大于等于 b - eps 的数,都可以判断为大于等于 b 。

| a | a ______|______|______|______ b-eps b b+eps

宏代码如下,将 a 和 b 相减,如果差大于等于 -eps 则有 a >= b - eps ,于是返回 true ,否则返回 false 。

#define greaterEqu(a, b) (((a) - (b)) >= (-eps)) 6. 用小于实现其他运算符 const double eps = 1e-8; #define equ(a, b) ((fabs((a) - (b))) = (-eps))

其实我们不必推导和列出上面全部代码,只需要记住并复用 less(a, b) 就可以实现其他所有运算符:

const double eps = 1e-8; #define less(a, b) (((a) - (b)) < (-eps)) #define equ(a, b) (!less((a), (b)) && !less((b), (a))) #define lessEqu(a, b) (less((a), (b)) || equ((a), (b))) #define greater(a, b) (!lessEqu((a), (b))) #define greaterEqu(a, b) (!less((a), (b)))


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有