Скорость выполнения функций 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:

а зачем эта формула нужна при подаче на ее вход целого числа?

с уважением.


ну вы ж можете и не знать, целое оно или не целое. Бывает такое, что double число может стать и целым.

 
Andrey Kisselyov:

P.S.  нужно понимать, если вы хотите быть хорошим программистом, что не везде и не всегда нужно пихать разного рода ускоряющие функции, это зависит от поставленной задачи и алгоритма с которым вы работаете.

Конечно. Поэтому я и писал "применять при целесообразности"
 
Nikolai Semko:

ну вы ж можете и не знать, целое оно или не целое. Бывает такое, что double число может стать и целым.

тогда городите сразу огород, под ваши варианты числа на входе.
if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

с уважением.

P.S. double по определению не может быть целым, представление числа в памяти машины не изменится.
 
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:
при

у вас ничего не выйдет.
при таком подходе в любом случае можно найти число при котором ваша формула будет не верна. огород придется городить.

с уважением.


я уже об этом писал здесь

Советую вам перечитать данный топик, чтобы не повторяться.
Причина обращения: