将浮点数转换为整数,还是将整数转换为浮点数?

5

我可以将常量定义为浮点数或32位无符号整数:

const float SecondsPerMinute = 60.0F;

或者

const uint32 SecondsPerMinute = 60U;

const关键字在一些需要int类型的方程和一些需要float类型的方程中使用。为了让我的编译器和静态分析工具更加满意,我会根据需要将其static_cast到适当的类型。

是将const定义为float并强制转换为int,还是将其定义为int并转换为float更好?这有区别吗,还是更多地是个人意见的问题?

假设该常量被用作int和float的次数相等。


3
如果你需要添加无用的强制转换将60u转换为60f,那么你的静态分析工具并没有起到帮助作用。 - Alan Stokes
5
如果将其定义为浮点数,则在需要整数的每个方程式中,您都将将其转换为整数,反之亦然。那么为什么不定义两个常量,一个用于整数,另一个用于浮点数,并根据需要使用它们?如果代码大小并不是问题,这肯定会提供与任何其他替代方法相同甚至更好的性能。唯一的缺点是您的代码大小会增加。 - Nishant
在任何方向上的转换中都不会丢失信息(两种表示都是精确的)。而且在任何方向上都不需要强制转换。所以这一点根本不重要。 - Alan Stokes
我同意在这种简单情况下,静态分析工具可能会造成不必要的复杂性,但它们的目的是揭示可能导致意外行为的情况。而在 int 与 float 的情况下,如果使用 float 而期望的是 int,则可能会合法地失去精度。只是说一下... :) - C. Korb
当值是一个常量,并且这个常量可以被表示为整数或浮点数时,就不需要发出警告。 - Alan Stokes
这些工具有时可能会让人感到压抑,但我很感激它们在一些情况下能够捕捉到真正的问题。但你说得对,这不是那种情况! - C. Korb
1个回答

12
如何使用模板:
template <typename T>
constexpr T SecondsPerMinute = T(60);

使用方法:

std::printf("%d %f", SecondsPerMinute<int>, SecondsPerMinute<double>);

太好了。我刚花了10分钟尝试做同样的事情,结果写了超过10行不起作用的代码..谢谢! - Humam Helfawi
1
我认为这是解决这个问题的好方法,并且可以扩展到许多类似的情况。谢谢! - C. Korb
或者一个可以隐式转换为整数和浮点数的类呢? - krOoze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接