10/3=3
, а 20/3=7
.С математикой у меня туго, поэтому написал это дело так:
__int64 RoundedDivision(__int64 Dividend, __int64 Divisor)Однако не покидает мысль что можно написать как-то попроще.
{
__int64 DoubleResult = (Dividend << 1) / Divisor;
return ((DoubleResult < 0) ? DoubleResult : (DoubleResult + 1)) >> 1;
}
PS. Заодно немного потормозил над тем, что при отрицательном знаке DoubleResult не нужно вычитать единичку. Видимо совсем забыл как считать в дополнительном коде.
2 комментария:
floor(Dividend/Divisor + 0.5) подойдёт?
Наверно ты имеешь ввиду floor((long double)Dividend/Divisor + 0.5)
__int64 в double не влезет, придется использовать long double. Чё-то мне кажется что вся эта хрень будет жутко тормозить по сравнению с приведенной мною целочисленной конструкцией: ведь понадобится перевод в плавающую точку, потом деление и сложение long double, вызов floor(), потом перегон обратно из сопроцессора... Мерять производительность лень, но ставлю что вся эта затея с сопроцессором проиграет по скорости моему варианту.
Отправить комментарий