编译时灵活设置C++浮点数精度的字面量匹配及转换疑问
解决C++中动态匹配字面量精度的方案
一、自定义字面量实现自动匹配
C++11及以上支持用户自定义字面量,你可以针对dtype定义专属后缀(比如_dt),让字面量自动匹配精度:
#include <type_traits> // 对应float类型的dtype constexpr float operator "" _dt(long double val) { static_assert(std::is_same_v<dtype, float>, "字面量_dt与dtype类型不匹配"); return static_cast<float>(val); } // 对应double类型的dtype constexpr double operator "" _dt(long double val) { static_assert(std::is_same_v<dtype, double>, "字面量_dt与dtype类型不匹配"); return static_cast<double>(val); }
使用时直接写3.65_dt,编译期会自动根据dtype的定义匹配对应精度,完全没有运行时开销。
二、关于强制转换的性能顾虑
你当前用的(dtype)3.65强制转换写法,在开启常规优化(比如-O2及以上)时,编译器会直接把双精度的3.65编译为对应单精度的数值,不会在运行时先构造双精度再转换——这种转换的开销会被完全消除,不需要担心性能问题。
三、简洁的宏定义替代方案
如果不想用自定义字面量,也可以用宏包裹数值,实现编译期自动转换:
#define DT_LITERAL(x) static_cast<dtype>(x)
使用时写min(var0, DT_LITERAL(3.65)),可读性更好,同样是编译期处理,无运行时开销。
内容的提问来源于stack exchange,提问作者Christoph Heim
相关产品推荐
相关产品推荐

