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

 
Nikolai Semko:


当然,你是对的。但我还是要说。对于99.9%的任务来说,用替代的更快的变体来取代四舍五入函数是绝对正确的,它使用小数类型转换为(int)或(long)。一个有经验的程序员只是应该意识到这个事实,并在合适的时候应用它。

在99%的情况下,根本不需要麻烦四舍五入。对于价格比较,我有这样的胡说八道。

// 0 - first is greater than second
// 1 - equal
// 2 - second is greater than first
uchar compare_prices(double first, double second)
{
   if(first - second >= _Point)
      return 0;
   if(second - first >= _Point)
      return 2;

   first = round(first/_Point);
   second = round(second/_Point);
   
   if(first > second)
      return 0;
   if(first < second)
      return 2;
   return 1;
}

你可能会注意到,在大多数情况下,它根本就不会到round(),尽管我没有测量过速度。

 
Nikolai Semko:

上文

当x=3(任何整数)时,就会出现卡壳现象:))

是我的还是你的配方有接头?

恭敬地说。
 
Andrey Kisselyov:
是我的配方有问题还是你的配方有问题?

恭敬地说。

在我的老房子里。

y=ceil(x);  -> y=(int)(x+1);

并在你的。

y=ceil(x);  -> y=(int)(x)+1;

当x=3时,在这两种情况下都会出现4的错误值

和变体。

y=ceil(x);  -> y=(int)(x+0.9999999999999997);

是迄今为止最正确的,同时保持最大的执行速度。

 
Nikolai Semko:

在我的老房子里。

并在你的。

在x=3的情况下,都会有一个错误的值4。

并在有变数的情况下。

是迄今为止最正确的,同时保持最大的执行速度。

但是当你给一个整数的输入时,为什么需要这个公式?

与尊重。

P.S. 你需要明白,如果你想成为一个好的程序员不是在任何地方,也不是总是需要塞进各种加速函数,这取决于你手头的任务和你正在处理的算法。
 
Andrey Kisselyov:

但是,当你给一个整数的输入时,为什么你需要这个公式?

真诚的。


你可能不知道它是一个整数还是一个非整数。有的时候,一个双数可以变成一个整数。

 
Andrey Kisselyov:

P.S.如果你想成为一个好的程序员,你必须明白,不是在任何地方,也不是总是需要塞进各种各样的加速函数,这取决于你手头的任务和你正在使用的算法。

当然了。这就是为什么我写了"在适当时候应用"
 
Nikolai Semko:

你可能不知道它是一个整数还是一个非整数。有的时候,一个数字可以变成一个整数。

然后直接去找你的输入数字的变体。
if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

恭敬地说。

P.S. 根据定义,双倍数不能是整数,数字在机器内存中的表示不会改变。
 
Andrey Kisselyov:
那么你就必须在输入的数字选择上大做文章。

恭敬不如从命。


这就是原因,所以我们不必大惊小怪。

if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

写起来比较容易。

y=(int)(x+0.9999999999999997);

或者这样。

#define _ceil(x)  (int)((x)+0.9999999999999997)
...
y=_ceil(x);
 
Nikolai Semko:

所以你不必大惊小怪。

它更容易写。


1-0.9999999999999998

你不会得到它的权利。
通过这种方法,你可以找到一个数字,在这个数字上你的公式将不起作用。

恭敬地说。

 
Andrey Kisselyov:

这是不可能的。
用这种方法,你会发现一个数字,在这个数字上你的公式就不起作用了。

恭敬地说。


我已经在这里 写过了。

我建议你重读一下这个主题,这样你就不会重复自己。