我有以下代码(可以随意用 double 更改 float):
class A
{
public:
void setValueFloat(float v) {
m_floatValue = v / 3.6; // m/s <-> km/h conversion
}
void setValueInt(int v1, int v2) {
m_intValue1 = v1; m_intValue2 = v2;
}
bool conditionIsOk()
{
if(m_intValue1 > m_intValue2)
{
if(m_intValue1 - m_intValue2 > m_floatValue)
{
return true;
}
}
return false;
}
private:
int m_intValue1, m_intValue2;
float m_floatValue;
};
和其他地方:
A a;
int something = 5; // Intentionally int
int somethingElse = 6; //these are just some numbers, not production data!!!
int moreStuff = 7;
a.setValueFloat(something);
a.setValueInt(somethingElse, moreStuff);
if(a.conditionIsOk())
{
// Yippee!
}
以及问题:
比较算术运算的结果有多安全int
s to a float
鉴于上述情况?
是否有必要(float)m_intValue1 - (float)m_intValue2 > m_floatValue
对于这种情况?
在 C/C++ 标准中我可以在哪里找到关于这种情况的一行文字?
对于简单的情况默认会进行什么类型转换m_intValue1 - m_intValue2 > m_floatValue
? (我怎样才能以一种他也看到它(视觉上)的方式向其他人展示这一点,“仅仅相信它有效”是不够的:))
这取决于实际的实现(即使用哪个编译器和哪个体系结构)。在典型的 32 位系统上int
s 和 IEEE754 二进制 32float
s 整数最多可以精确表示为 +-2^24 作为浮点数,因此不适用于所有可能值。所以不,一般来说它并不安全,但如果整数(或者在这种情况下是差异!)和浮点数的使用范围受到适当限制,则可能是安全的。
不!实际上m_intValue1 - m_intValue2 > m_floatValue
更好,因为转换为浮点数是在计算差异之后发生的(请参阅上述点中有关差异的注释)。你可以明确地写static_cast<float>(m_intValue1 - m_intValue2) > m_floatValue
,但这不是必要的。
C++ 标准第 4 章介绍了转换(请参阅草案 N3242)。特别是 4.9 浮点积分转换,另请注意 5§10“常用算术转换”,它也适用于比较。由于该问题在 C 标准中也被标记为 C(请参见草案 N1570) 相应的章节是 6.3.1,特别是 6.3.1.4 和 6.3.1.8。
请参阅 2 和 3 的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)