Тема: 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
Для відправлення відповіді ви повинні увійти або зареєструватися