我有使用浮点数作为存储类型的弧度和度数的别名。
当我在这两个单位之间进行转换时,我看到程序集将值提升为双倍,然后在进行转换时返回浮点数。
问:如何确保所有操作和转换都保留在浮点数中?
我的代码:
using radians_f = boost::units::quantity<boost::units::si::plane_angle, float>;
using degrees_f = boost::units::quantity<boost::units::degree::plane_angle, float>;
degrees_f to_degrees(const radians_f& angle) { return static_cast<degrees_f>(angle); }
radians_f to_radians(const degrees_f& angle) { return static_cast<radians_f>(angle); }
从编译器资源管理器中,我看到以下汇编说明:https://godbolt.org/z/Gnjr54dn6
>
cvtss2sd-将源操作数中的单精度浮点值转换为目标操作数中的双精度浮点值。
mulsd-将第二个源操作数中的低双精度浮点值乘以第一个源操作数中的低双精度浮点值。
cvtsd2ss-将“从转换”源操作数中的双精度浮点值转换为单精度浮点值
PS:如果我错误地定义了别名或/和转换函数,我不会感到惊讶。
我找到了一个黑客的解决方法(我确信可以通过使Boost Units计算每弧度常数57. x度来“产品化”)来避免与double
之间的转换,但它确实突出了Boost Units导致另一种令人惊讶的开销的事实:如果您直接使用flo
,甚至您自己的flop
包装器,则不需要内存加载和存储。
演示:https://godbolt.org/z/afPE7baxT
因此,虽然上面展示了一种(未改进的)强制计算保持为浮点数的方法,但如果你真正的问题是“我如何避免开销”,你离涅槃还有一点远。