首页 > 解决方案 > 从浮点数中删除小数部分但保留类型的有效方法

问题描述

我知道通过 std::round、std::floor 或 std::ceil 或简单的类型转换,我们可以删除小数部分,但是通过类型转换,变量会丢失其原始类型( float 或 double )。

有什么办法,我可以保留类型并仍然有效地删除小数部分。

我认为的一种方法是从数字中减去小数部分,但这并不是那么有效。那么,也许还有其他方法?

例子 -

float a = 123.456;

float b;

b = do something on a;

结果 b 是 123.0

标签: c++floating-point

解决方案


例如,std::round保留原始类型:

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

std::floor对于和也是如此std::ceil

添加。以下是一些基准测试结果。

编译器原始循环 std::ceil std:floor std::trunc std::round
-------------------------------------------------- ------------------
海合会 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.0msvs 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:精确 /fp:except /O2 /std:c++latest ...
msvs(f): /fp:fast /fp:except- /O2 /std:c++latest ...

坦率地说,我认为这些结果本身(绝对值)并不相关。使用快速数学选项,一些函数可以简化为一条汇编指令vroundss。应该对真实代码进行分析以获得相关结果。


推荐阅读