Эффективный способ вывести дробную часть из поплавка, но сохранить тип - PullRequest
0 голосов
/ 01 сентября 2018

Я знаю, что с помощью std :: round, std :: floor или std :: ceil или просто приведением типов мы можем отбросить десятичную часть, но при приведении типов переменная теряет свой первоначальный тип (float или double).

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

Один из методов, которые я думал, вычитал дробную часть из числа, но это не так эффективно. Итак, может быть, есть какие-то другие методы?

Пример -

float a = 123.456;

float b;

b = do something on a;

результат b равен 123,0

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Выезд modf:

#include <cmath>

float a = 123.456;
float b, c;

c = std::modf(a, &b);
// c = 0.456
// b = 123.0

Вам не нужно использовать возвращаемое значение (дробную часть), если оно вам не нужно.

Или (начиная с C ++ 11) trunc:

float b = std::trunc(a);
0 голосов
/ 01 сентября 2018

Например, с std::round сохраняется исходный тип:

float round(float arg);
double round(double arg);

Это также верно для std::floor и std::ceil.

Добавление. Вот некоторые результаты тестирования.

Compiler     raw loop   std::ceil  std:floor  std::trunc  std::round
--------------------------------------------------------------------
gcc          8.36       8.20       8.19       8.21        32.95
gcc(f)       2.88       8.20       8.20       8.20        11.01
msvs         8.20       28.47      31.90      67.14       97.84
msvs(f)      8.13       13.70      14.00      67.27       97.50

Компиляторы: gcc 7.3.0 и msvs 2018 15.9.0, машина: Core i7-4770.

код . Варианты компиляции:

gcc: --std=c++17 -O3 -m64 -march=native -fno-tree-vectorize
gcc(f): --std=c++17 -O3 -m64 -march=native -ffast-math -fno-tree-vectorize
msvs: /fp:precise /fp:except /O2 /std:c++latest ...
msvs(f): /fp:fast /fp:except- /O2 /std:c++latest ...

Честно говоря, я не думаю, что эти результаты сами по себе являются очень важными (в абсолютных значениях). С опцией быстрой математики некоторые функции сводятся к одной инструкции по сборке vroundss. Реальный код должен быть профилирован для получения релевантных результатов.

...