Тема: ceil з мінусовими числами
Чи є якась функція, що повертає 
-1.5 -> -2
 1.5 ->  2бо поки що я роблю так:
int ceil_abs(float f)
{
    return f < 0 ? floor(f) : ceil(f);
}Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → ceil з мінусовими числами
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Чи є якась функція, що повертає 
-1.5 -> -2
 1.5 ->  2бо поки що я роблю так:
int ceil_abs(float f)
{
    return f < 0 ? floor(f) : ceil(f);
}Та ніяк, лише йогою займатися.
Можна такою. :-)
#include <iostream>
#include <cmath>
using namespace std;
int ceil_abs(float f)
{
        return copysignf(ceilf(fabsf(f)),f);
}
#define TST(a)  cout << #a << " -> " << ceil_abs(a) << endl
int main()
{
        TST(1.5);
        TST(-1.5);
}змінено: додав суфікси f до функцій — якщо вже аргумент float, щоб не симкало туди-сюди у double
У PHP робив так, там така ж проблема.
В С буде приблизно те ж..
$f = -1.5; //вхідне число
$result = ceil(abs($f)) * -1; //заокруглюємо вже додатнє число, а результат робимо від'ємним.
echo $result; //-2Спробував глянути на тему під кутом швидкості роботи.
Варіант return f < 0 ? floor(f) : ceil(f); має явну перевірку з умовним переходом, який у загальному випадку непередбачуваний.
А другий варіант на перший погляд лінійний, fabsf взагалі одна команда процесора.
Та з'ясувалося, що, принаймні для gcc, ота copysignf не копіює знаковий біт з однієї змінної в іншу, а робить, у С-шному еквіваленті, щось таке
float copysignf(float dst, float src)
{
        dst = fabsf(dst);       // це одна команда
        if (signbit(src)) {     // тут саме зі слова src бітовою маскою виймається знак
                dst = -dst;     // це теж одна команда
        }
        return dst;
}Тобто умовний перехід все одно є, виймання знаку та перевірка з переходом на око приблизно еквівалентні f < 0 ?, тобто різниця невелика і може бути в будь-який бук.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися