我正在开发一款多人游戏,它依赖于所谓的“浮点确定性”,换句话说,所有运行该游戏的每个人的所有计算结果必须完全相同。这实质上意味着不使用 IEEE 754 float ,因为操作可能会产生不同的值,具体取决于舍入模式、使用的融合乘加或逆平方根指令、不同的 libc 实现等。
所以我做了所有基本算术运算甚至一些先验函数的定点版本。但是我仍然喜欢使用浮点文字来配置游戏变量。在这样做的过程中,我最终得到了一些看起来像这样的代码,用于将 float 转换为定点数:
explicit NetFixedPoint(float val)
{
static const StorageType kOne = StorageType(1) << FractionalBits;
m_Value = ((StorageType)(val * kOne));
}
这会在所有平台和处理器架构上给我相同的结果吗?
最佳答案
简短的回答是“不”。
浮点表示是实现定义的,在将浮点值转换为其他类型时,您提到的浮点类型之间的关注类型也会发生。
此外,int
的许多属性 - 包括大小、它可以表示的值的范围和表示(例如位的组织)也是实现定义的。
最终效果是,从 float
到 int
的某些转换将在实现之间可靠地工作,而有些则不会。将 float
转换为 int
时,某些值会向下舍入。 float
也可以表示比 int
更大范围的值,转换“超出范围”的值可能会产生未定义的行为。
与其尝试使用浮点文字来初始化变量,不如考虑使用字符串文字(并将值用双引号引起来)。权衡是解析字符串以初始化变量的开销。
关于c++ - 从 float 到 int 的转换在所有平台和处理器架构中是否一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211841/