Например, с 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
. Реальный код должен быть профилирован для получения релевантных результатов.