c - 可移植一致浮标

标签 c floating-point portability

Similar to this question我正在制作一个步调一致的 P2P 虚拟世界,并且由于使用固定点而不是 float 而遇到了松弛。

我试图制定可移植 float 的基准,但发现 GCC 不支持 -fp-model=strict :(

IEEE 754-2008 第 11 条解决了使 float 在不同实现中表现一致的问题。但是 C/C++ 标准是否反射(reflect)了这一点?

ICC 有 -fimf-arch-consistency=true 但不可移植。

使用软件库是获得一致性 float 的唯一方法吗?

编辑:Annex-F 是 IEC 60559:1989,相当于 IEEE 754-1985 '11。 “可重现的浮点结果”直到 IEEE 754-2008 才添加,并表示“语言标准应该支持可重现的编程”。根据 WikiP 的说法,这意味着它是可选的,即使这样,它也只有在您告诉它如此时才可以重现。

最佳答案

如果您坚持基本算术,请使用标准一致性选项(-std=c11 而不是 gnu11,不要使用诸如 -ffast-math< 之类的虚假内容),并注意其他一些微妙之处,float 算术在所有 float_t 的符合附件 F 的实现上是完全确定性和一致的float,对于 double 的实现也是如此,其中 double_tdouble。这是很多约束,如果没有 softfloat,最后一个约束(“无超额精度”)可能根本无法满足。

无论谁在使用定点方面给你带来困难,他都错了。浮点运算不适合需要确定性和同步的机制。即使满足上述所有约束,它仍然不是平移不变的 - 它的行为在“远离原点”和“靠近原点”时有显着不同。

浮点非常适合表示层。在那里使用它。对于机制/模拟层,不需要。

关于c - 可移植一致浮标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57931671/

相关文章:

结构指针地址比较不起作用

c - 把一个词变成***符号

python - Swig,返回 double 数组

c - 如何在C中将二进制字符串转换为二进制补码和IEEE

c# - 为什么我不能在 C# 中将 1.2 值分配给 float 变量?我在 C 和 C++ 中做了同样的事情,并且成功了

c++ - 获取用户名的便携方式

c - 如何在双向链表中实现 "prev"指针逻辑

ruby - 如何将 Ruby 位串转换为浮点型?

css - 显示 :flex; cancels margins% on firefox but works on chrome

c++ - 为多个平台构建 Linux 二进制文件