比较2个双精度,但C上没有所有数字
我想比较两个数字,但不包括所有数字。 例如,我有一个双精度的1.548799778和一个1.547990978,我想分别比较1.xx。我怎样才能把这个双精度“圆”到1.xx??比较2个双精度,但C上没有所有数字,c,compare,double,C,Compare,Double,我想比较两个数字,但不包括所有数字。 例如,我有一个双精度的1.548799778和一个1.547990978,我想分别比较1.xx。我怎样才能把这个双精度“圆”到1.xx?? 感谢使用math.h中的函数来比较x和y是否足够接近,例如 (x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6 (x==0.0&&y==0.0)| | fabs(x-y)/max(fabs(x),fabs(y))一种技术将使用如下tr
感谢使用math.h中的函数来比较
x
和y
是否足够接近,例如
(x==0.0 && y==0.0) || fabs(x-y)/max(fabs(x),fabs(y))<1e-6
(x==0.0&&y==0.0)| | fabs(x-y)/max(fabs(x),fabs(y))一种技术将使用如下trunc
函数:
double d1, d2;
d1 = 1.548799778;
d2 = 1.547990978;
if (trunc(d1*100) == trunc(d2*100)) {
// do your thing
}
使用100
,因为需要两位小数。如果需要更多或更少的小数位数,可以使用其他数字。另一种可能是只使用与公差的比较
if (fabs(a - b) <= tolerance) { .... }
if(fabs(a-b)以下代码可能具有最快的执行时间,并且作为浮点变量的一般比较非常有用
if ( x-y < 0.01 && x-y > -0.01 )
if(x-y<0.01&&x-y>-0.01)
您可以使用Math.h
函数
double check(double number)
{
if (modf(number, 0) >= .5)
return number >= 0 ? ceil(number) : floor(number);
else
return number < 0 ? ceil(number) : floor(number);
}
double round(double number, unsigned int places)
{
double off = pow(10, places);
return check(number * off) / off;
}
if(round(1.548799778, 2) == round(1.547990978, 2))
{
}
双重检查(双重编号)
{
if(modf(数字,0)>=0.5)
返回编号>=0?单元(编号):楼层(编号);
其他的
返回编号<0?单元(编号):楼层(编号);
}
双舍入(双位数,无符号整数位)
{
双关=功率(10个位置);
退货检查(编号*关)/关;
}
如果(圆形(1.548799778,2)=圆形(1.547990978,2))
{
}
如果需要,这应该是相当快速和可配置的。不引入额外的继承
int compare(double a, double b)
{
static const double PRECISION = 0.0001;
if (a < b)
return b - a < PRECISION ? 0 : 1;
else
return a - b < PRECISION ? 0 : -1;
}
int比较(双a,双b)
{
静态常数双精度=0.0001;
if(a
你想要什么样的舍入?例如,向上舍入还是向下舍入?@AdrienPlisson:我删除了我的帖子…谢谢你的解释你想要舍入还是真的舍入?我有一个双1.xxxxxxxxxxxxxxxxxxxx(20),我想要1.xxxxxxxxxx(11)如果a
和b
都是很小的数字,比如1e-6
和2e-6
,公差为1e-5
,那么可能无法很好地进行比较。请参阅我的答案以获得更好的建议。是的,这使用绝对公差,而您的方法使用相对公差erance,但是暴露的问题可以用这个方法解决,它只需要少量的数字,看起来是2,所以在这种情况下,这个方法应该足够了。我需要为此导入任何库吗?因为它说trunc在C99中无效。我尝试了1000000000以获得1.XXXXXXXXXXXXXX,但我得到了XXXXXXXXX.XXXXXX而不是“x==0&&y==0”我将简单地使用“x==y”,如果这两个数字相等,则速度更快。