c - 假设在 C 中使用 IEEE754 float 表示 float 是否安全?

标签 c floating-point ieee-754

float 是在 C 中定义的实现。因此没有任何保证。

我们的代码需要可移植,我们正在讨论是否可以接受在我们的协议(protocol)中使用 IEEE754 float 。出于性能原因,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。

虽然我知道平台和架构之间在 longwchar_t 的大小方面可能存在差异。但我似乎无法找到任何关于 floatdouble 的具体信息。

到目前为止,我发现字节顺序在大端平台上可能是颠倒的。虽然有些平台不支持 float ,但其中包含 floatdouble 的代码甚至不会链接。否则平台似乎坚持 IEEE754 单精度和 double 。

那么假设浮点可用时在 IEEE754 中是安全的吗?

编辑:回应评论:

What is your definition of "safe"?

安全的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节轮换处理字节顺序之后)。

最佳答案

基本上当前非穿孔卡使用的所有架构,包括嵌入式架构和特殊信号处理架构,都提供以下两种浮点系统之一:

  • IEEE-754。
  • IEEE-754 除了废话。也就是说,它们主要实现了 754,但在一些更昂贵和/或繁琐的位上便宜了。

最常见的便宜出局:

  • 将非正规化归零。这使某些有时有用的定理无效(特别是如果 ab 在 2 的因数内,则可以精确表示 a-b 的定理),但实际上这通常不会成为问题。
  • 未能将 infNaN 识别为特殊值。这些架构将无法遵循关于 infNaN 作为操作数的规则,并且可能不会饱和到 inf,而是产生大于FLT_MAX,通常会被其他架构识别为NaN
  • 除法和平方根的正确四舍五入。保证结果在精确结果的 1-3 ulp 以内比在 1/2 ulp 以内要容易得多。一个特别常见的情况是将除法实现为倒数+乘法,这会损失一点精度。
  • 更少或没有保护数字。这是一个不寻常的便宜,但意味着其他操作可以节省 1-2 ulp。

BUUUUT...即使是那些except for blah 架构仍然使用 IEEE-754 的数字表示。除了字节顺序问题,在架构 A 上描述 floatdouble 的位基本上保证在架构 B 上具有相同的含义。

因此,只要您只关心值的表示,就完全没问题。如果您关心操作的跨平台一致性,您可能需要做一些额外的工作。

编辑:正如 Chux 在评论中提到的,平台之间不一致的一个常见额外来源是扩展精度的使用,例如 x87 的 80 位内部表示。这与廉价相反,并且(通过适当的处理)完全符合 IEEE-754 和 C 标准,但它同样会导致架构之间的结果不同,甚至编译器版本之间以及遵循明显次要和不相关的代码变化。但是:由于扩展精度,特定的 x86/x64 可执行文件不会在不同的处理器上产生不同的结果。

关于c - 假设在 C 中使用 IEEE754 float 表示 float 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967040/

相关文章:

c - 打开C中其他目录中存在的txt文件

c - 如何从 Netlink 套接字中注册的回调函数以外的函数发送和接收消息?

c - 为什么选择gst_element_factory_find can't find factory “decodebin”?

sorting - 如何对 `NaN` 进行排序,使其大于任何其他数字,并等于任何其他 `NaN` ?

floating-point - Lua-包装IEEE754单精度 float

.net - .NET十进制,IEEE十进制…关于此以及将来的任何讨论?

去 float 比较

将整数值从 Char 指针复制到 C 中的局部变量

Objective-C - 对 nan 进行浮点检查

python - 很好地表示 python 中的 float