c++ - 从浮点数中删除小数部分但保留类型的有效方法
问题描述
我知道通过 std::round、std::floor 或 std::ceil 或简单的类型转换,我们可以删除小数部分,但是通过类型转换,变量会丢失其原始类型( float 或 double )。
有什么办法,我可以保留类型并仍然有效地删除小数部分。
我认为的一种方法是从数字中减去小数部分,但这并不是那么有效。那么,也许还有其他方法?
例子 -
float a = 123.456;
float b;
b = do something on a;
结果 b 是 123.0
解决方案
例如,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.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:精确 /fp:except /O2 /std:c++latest ... msvs(f): /fp:fast /fp:except- /O2 /std:c++latest ...
坦率地说,我认为这些结果本身(绝对值)并不相关。使用快速数学选项,一些函数可以简化为一条汇编指令vroundss
。应该对真实代码进行分析以获得相关结果。
推荐阅读
- llvm - llvm 上的实时范围(间隔)分析
- uber-api - 无法在安装了 Web 安全网关的 iOS 上登录优步。需要帮助识别白名单的 URL
- c - 从命名管道读取
- bash - 对 sh 中的字符串进行条件赋值
- javascript - 尝试从另一个 js 文件导入函数时出错
- ios - 本地化的 .xib 文件无法通过 TestFlight
- angular - *Ng 如果在 observable 上的请求完成时不更新 dom async
- android - android:我应该如何指示“搜索字符串”正在播放并正在过滤结果
- powershell - 从powershell返回值到管道内的管道
- nginx - 如何增加 nginx.conf 中的 client_max_body_size?