函数ceil()、round()、floor()的执行速度 - 页 3

 
Nikolai Semko:

是的,但如果。

那么就可以了。

还有待观察的是,对于任何数量的x来说都是可以的
 

A100:

void OnStart()
{
        Print( (int)(3.0001 + 0.999999999999999)); //все равно 4
        Print( floor(3.00001));                    //3
}




我不明白。有什么问题呢?

 
A100:
是否对任何数字X都可以,还有待观察。

当然,它不会...

毕竟,如果发生这种情况。

double x=3;
x=x+0.1;
x=x+0.1;
x=x+0.1;
x=x+0.1;
if (x!=3.4) Print("oppps..."); // oppps...

那么,这些问题既不是针对我,也不是针对这个想法。

 
Nikolai Semko:
有什么问题呢?
void OnStart()
{
        double d =  16 + 0.999999999999999;
        Print( (int)(d + 0.999999999999999)); //18
        Print( (int)ceil( d ));               //17
}
 
 
Nikolai Semko:
那么,这些问题既不是针对我,也不是针对这个想法。
floor()、ceil()、round()是为了避免问题的出现。
 

我认为上述所有这些故障都超出了这个加速正整数四舍五入的解决方案的实际使用范围,因为很少有人需要16位数级别的精度。而这些错误来自于编译器本身的各种点级的溢出。

 
A100:
Floor(), ceil(), round()就是为了这个目的而存在的--所以没有问题。

我并不禁止你使用它们。欢迎你使用它们。我将自己使用它们。但是,如果我创建一个速度很重要的算法,我将使用这种四舍五入的变体,并考虑到这种方法的所有细微差别。我认为对其他程序员来说,知道这个替代方案的存在会很有用。这场讨论正是我们需要了解的这种四舍五入方法的细微差别。非常感谢你们所有人。我说得不对吗?

 
Nikolai Semko:

DBL_MINDBL_EPSILON不起作用 - 太小 了。也许留下0.9999999999999999(16个9--双数中小数点后的最大数字)是有意义的。

所以,DBL_EPSILON是16位小数:2.2204460492503131e-016

在你的情况下,你实际上得到了一个,因为差异只有1e-16,比epsilon少2倍。

 
Alexey Navoykov:

所以DBL_EPSILON是16位小数:2.2204460492503131e-016

而在你的情况下,你实际上得到了一个,因为差异只有1e-16,这比epsilon少2倍。


是的,我明白,但这并不可行。结果发现它对16个9也不起作用(奇怪,以前似乎还能用)。它只适用于15个九点。

double x=3;
int Y=(int)ceil(x);
Print(Y);                         // 3
Y=(int)(x+0.999999999999999); 
Print(Y);                         // 3  (15 9-ток)
Y=(int)(x+0.9999999999999999);
Print(Y);                         // 4  (16 9-ток)
Y=(int)(x+1-DBL_EPSILON);
Print(Y);                         // 4