如何保持单位转换在提升:单位在单一的精漂浮?

0

的问题

我的别名的弧度和程度,使用浮动作为储存的类型。

当我之间的转换这两个单位,我看到大会促进的价值以双然后回到漂浮在这样做的转换。

问: 我如何能确保所有作业和转换住在漂浮?

我的代码:

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); }

从编译器explorer我看到下面大会的指示: https://godbolt.org/z/Gnjr54dn6

  • cvtss2sd 转换为一个单一的精度浮点值中的"转换-从"源操作数的双精度浮点值在目的地操作数。

  • mulsd -乘以低双精度浮点的价值,在第二来源操作数通过低双精度浮点值中的第一来源的操作数。

  • cvtsd2ss 将双精度浮点值中的"转换-从"源操作数的单个精度浮点价值

PS:我不会感到惊讶,如果我已经定义了我的别名或/和我换的功能不正确。

boost boost-units c++ c++14
2021-11-23 10:02:53
1

最好的答案

1

我发现了一个哈克的解决方法(其中我肯定可以"productionized"通过使提高单位计算57.x度每弧度不变),以避免的转换并从 double但这真的很突出的事实提高单位造成的另一个令人惊讶的排序的开销:存货和储存这是不必要的,如果你使用 float 直接的,或者甚至你自己包装 float.

演示: https://godbolt.org/z/afPE7baxT

因此,虽然上述的表示之一(毛)的方式来部队计算,以留作为浮动,如果你真正的问题是"如何避免开销"你还是有点远离涅槃。

2021-11-23 10:46:36

不幸的是使用的角度是最小的可重复的例子"的问题我该如何避开销",因为该问题适用于许多其他单位,我需要。
CJCombrink

@CJCombrink:是的,我的意思是它看起来像避免的(所有)开销可能需要放弃提高单位,根据该演示我做了以上。
John Zwinck

具有析构或复制构造你的包装可能会导致这suboptimality.
n. 1.8e9-where's-my-share m.

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................