从浮点数中删除小数部分但保留类型的有效方法
Efficient way to drop the fractional part from float but retain the type
我知道通过 std::round、std::floor 或 std::ceil 或简单的类型转换,我们可以删除小数部分,但使用类型转换,变量会丢失其原始类型(浮点数或双精度(。
有什么办法,我可以保留类型并仍然有效地删除小数部分。
我认为一种方法是从数字中减去小数部分,但这并不那么有效。那么,也许还有其他一些方法?
例-
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
也是如此。
加法。以下是一些基准测试结果。
编译器原始循环标准::ceil 标准:地板标准::trunc 标准::圆形 -------------------------------------------------------------------- 海湾合作委员会 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
。应该分析实际代码以获得相关结果。
查看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);
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 从浮点数中删除小数部分但保留类型的有效方法
- 当 std::make_tuple 是 r 值引用时,如何保留 std::string 类型
- 模板功能以映射特定类型,并保留所有其他不变的
- memcpy是否可以保留不同类型之间的数据
- 是否在值类型列表中保留引用类型
- C++:为指向两种类型之一的指针保留打开选项
- 返回类型,或如何保留对象指针的类型
- 如何在不同的上下文(例如线程)中保留原始异常类型信息
- 包装类型,但保留其有关函数重载的行为
- 在类中保留具有不同值类型的多个映射,并支持基于类型的查找
- vector::保留类型和内置类型
- 删除左值,保留左值引用(标准类型特征可用?)
- 如何在c++1y中保留cv限定符或返回类型推导中的引用
- 将double/float类型转换为string类型,保留科学记数法和精度