c++ - 从 float 到 int 的转换在所有平台和处理器架构中是否一致?

标签 c++ c floating-point

我正在开发一款多人游戏,它依赖于所谓的“浮点确定性”,换句话说,所有运行该游戏的每个人的所有计算结果必须完全相同。这实质上意味着不使用 IEEE 754 float ,因为操作可能会产生不同的值,具体取决于舍入模式、使用的融合乘加或逆平方根指令、不同的 libc 实现等。

所以我做了所有基本算术运算甚至一些先验函数的定点版本。但是我仍然喜欢使用浮点文字来配置游戏变量。在这样做的过程中,我最终得到了一些看起来像这样的代码,用于将 float 转换为定点数:

explicit NetFixedPoint(float val)
{
  static const StorageType kOne = StorageType(1) << FractionalBits;
  m_Value = ((StorageType)(val * kOne));
}

这会在所有平台和处理器架构上给我相同的结果吗?

最佳答案

简短的回答是“不”。

浮点表示是实现定义的,在将浮点值转换为其他类型时,您提到的浮点类型之间的关注类型也会发生。

此外,int 的许多属性 - 包括大小、它可以表示的值的范围和表示(例如位的组织)也是实现定义的。

最终效果是,从 floatint 的某些转换将在实现之间可靠地工作,而有些则不会。将 float 转换为 int 时,某些值会向下舍入。 float 也可以表示比 int 更大范围的值,转换“超出范围”的值可能会产生未定义的行为。

与其尝试使用浮点文字来初始化变量,不如考虑使用字符串文字(并将值用双引号引起来)。权衡是解析字符串以初始化变量的开销。

关于c++ - 从 float 到 int 的转换在所有平台和处理器架构中是否一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211841/

相关文章:

c++ - 扩大堆大小C++

c - 在 dbus 上用 C 语言进行 Bluez 编程

Java floatToRawIntBits/intBitsToFloat 或 doubleToRawLongBits/longBitsToDouble 等同于 ruby​​?

c++ - 字符串转换为数学表达式

c++ - 使用 iconv translit 从 UTF-8 转换为 CP1251

c++ - 为什么模板试图用 'int&' 而不是 'int' 实例化?

php - PHP 和 MySQL 中用于存储偶尔的小数值的浮点精度问题

c - 我的二进制文件中的这些额外字节是什么?

c++ - 如何dlopen jemalloc动态库

c++ - 读取浮点值时出错