可能重复:
浮动和双重比较的最有效方法
在我的程序中,一些双变量取值形式为1.00000001
. 这些变量的相等性检查1
显然失败了。
我想知道如何降低 c 中双精度类型变量的精度,以便整数相等。
您几乎不应该检查浮点值是否完全相等,特别是当它们来自计算时。您应该检查与比较值的差值的绝对值是否小于某个 epsilon。double 的“精度”由内部数字表示形式给出,您无法更改它。如何准确地选择 epsilon 可能很困难,对该答案有一些评论讨论,阅读它,但您最终会得到基于 epsilon 的实用平等。
没有便携的方式,不。
使用 GNU C 库,您可以使用此 API更改舍入模式。
但总的来说,最好用代码来表达,这样你的期望就会变得清晰和可移植:
#define EQUALITY_EPSILON 1e-3 /* Or whatever. */
if(fabs(x - y) <= EQUALITY_EPSILON)
{
}
您应该避免在浮点比较中检查相等性。相反,请使用epsilon
如下精度值:
if (fabs(a - b) < epsilon)
{
// treat a and b as equal
}
epsilon 的选择可能很复杂,但我的知识并没有那么远。
做一个谷歌搜索“每个程序员应该知道的关于浮点运算的知识”。这是一篇涵盖所有这些内容的知名文章。
“降低双精度型变量的精度”没有多大意义。您可能应该考虑而不是使用诸如 , 和 之类的函数ceil
,floor
以round
一种您可以很好地控制的方式从您的双精度数中生成一个整数,然后在比较中使用该整数。
在 C99 中
#include <stdio.h>
#include <math.h>
int main(){
double d = 1.00000001;
int i = (int)round(d);
printf("%d\n", i);
return 0;
}