Скорость выполнения функций ceil(),round(),floor() - страница 2

 
pavlick_:

А почему не к лонгу кастуете? Хотя и его можно переполнить, но переполнить инт много легче.


Конечно, можно и лонг, если есть необходимость.

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

x=3;

y=3; y=4;

 
Nikolai Semko:

Конечно, можно и лонг, если есть необходимость.

Так вы же способ рекламируете, его тупо и скопируют. Вообще так кастовать нельзя без всяких проверок, это UB:

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.
Может депозит сольёт, а может ещё чего сделает ))
 
pavlick_ :

Так вы же способ рекламируете, его тупо и скопируют. Вообще так кастовать нельзя без всяких проверок, это UB:

Может депозит сольёт, а может ещё чего сделает ))

Я ничего не рекламирую. Я делюсь идеей. Для этого форум и обсуждение и существуют. 

 
Dmitry Fedoseev:

x=3;

y=3; y=4;


точно! спсб. надо подумать, что с потолком можно сделать. 

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

Dmitry Fedoseev:

x=3;

y=3; y=4;

как вариант, хоть и не очень красивый, но скорость та же:

y=ceil(x);  -> y=(int)(x+0.999999999999999);
#define _ceil(x)  (int)((x)+0.999999999999999)

double x=3;
int y=_ceil(x);
 
 
Nikolai Semko:

как вариант, хоть и не очень красивый, но скорость та же:

Тогда наверно лучше было бы:  x + 1 - DBL_MIN.  Либо  x + 1 - DBL_EPSILON.  Я не проверял, попробуйте.

Да и как насчёт отрицательных чисел?  Там ведь по другому должно быть для ceil и floor

 
Alexey Navoykov:

Тогда наверно лучше было бы:  x + 1 - DBL_MIN.  Либо  x + 1 - DBL_EPSILON.  Я не проверял, попробуйте.

Да и как насчёт отрицательных чисел?  Там ведь по другому должно быть для ceil и floor

DBL_MIN и DBL_EPSILON не работают - слишком маленькие. Наверное имеет смысл оставить 0.9999999999999999 (16 девяток- максимальное число знаков после запятой в double)

Да, Вы правы - для отрицательных чисел должен быть другой алгоритм. Спасибо! Сделаю дополнение в первом сообщении.

Кому интересно - может подумать как решить задачу с отрицательными числами. Мне лично не интересно, т.к. все мои задачи связаны с положительными числами.

 
Nikolai Semko:

Наверное имеет смысл оставить 0.9999999999999999 (16 девяток- максимальное число знаков после запятой в double)

void OnStart()
{
        Print((int)(3.0 + 0.9999999999999999));
}
а вы проверяли результат?
 

A100:

void OnStart()
{
        Print( (int)(3 + 0.9999999999999999));
}


да, но если:

x=3;
int Y=(int)ceil(x);
Print(Y);
Y=(int)(x+0.999999999999999);
Print(Y);

то все нормально. Чудеса компилятора. :))

Причина обращения: