关于C++中浮点数间比较大小的疑问

来源:百度知道 编辑:UC知道 时间:2024/05/29 10:50:37
我用百度搜索了网上有关这个问题的解答,发现有以下4种方法:
(1)使用fabs(a-b) <= numeric_limits<float>::epsilon()
(2)使用!a>0&&!a<0
(3)使用!a>0&&!a<0
(4)将a,b分别乘于100后比较再分别除以100
我理解了方法(1),但不理解方法(2),还有方法(3)是不是错误的?
希望高手赐教!
哦!写错了……
改错如下:
(3)使用a>0&&a<0
还有方法(4)是不是错误的?

谢谢大家!

利德大侠:
————————————————————————————
专业的解法是这样的:
| u - v | / |u| <= e and | u - v | / |v| <= e(1)
| u - v | / |u| <= e or | u - v | / |v| <= e (2)
(1)式用来判断两个浮点数非常接近
(2)式用来判断两个浮点数足够接近
————————————————————————————
其中有几点我不大明白:
(1)文段中的e是指什么?自然数e?
(2)“非常接近”和“足够接近”的含义?区别?作用?
(3)希望大侠能解释一下这个算法的原理。(我只是一个C++初学者,刚刚查了一下Boost库的相关介绍,只知道了Boost库是怎么一回事,至于要使用如此复杂的它,看来仍需长时间努力。)

专业的解法是这样的:
| u - v | / |u| <= e and | u - v | / |v| <= e(1)
| u - v | / |u| <= e or | u - v | / |v| <= e (2)
(1)式用来判断两个浮点数非常接近
(2)式用来判断两个浮点数足够接近

上面的解法是BOOST库中的算法
一般常用的方法是fabs(a-b) <= numeric_limits<float>::epsilon()
或者fabs(a-b)<1e-6,后面的1e-6代表需要到达的小数精度

---------------
我看到的Boost中的这个用法是其中一个帮助文件里提到的,里面说abs(f1-f2) <= e这样的用法不能用于过小或过大的数,于是有了公式1和2,其中e是一个精度值,至于"非常接近”和“足够接近”的含义,我也不清楚,文章引用了一些英文资料,看不懂.Boost里的东西,现在还在研究中,我也只不过仅仅会写皮毛而已,你有兴趣可以自己查看其中的帮助文件floating_point_comparison.html

计算机表达浮点数时有数字精度问题,float 数有效数字7位,double 14位. 所以当判断两浮点数是否相等时,要考虑精度。方法1,考虑精度,正确。

方法2,3不对,只有a,没比较。4也不对,乘除不能增加精度。

简单的比较是 a > b
printf("%d ", a > b);
输出1,表示a > b真
输出0,表示a > b假

1 是对的,
2 3 好象不对,因为在计算机里一个数值固定下来后,不会产生这种比较方式的
4 也不对,因为7位有效数字可能都是小数,那乘100根本就得不出正确的答案

2、3不一样么?