float 是在 C 中定义的实现。因此没有任何保证。
我们的代码需要可移植,我们正在讨论是否可以接受在我们的协议(protocol)中使用 IEEE754 float 。出于性能原因,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。
虽然我知道平台和架构之间在 long
或 wchar_t
的大小方面可能存在差异。但我似乎无法找到任何关于 float
和 double
的具体信息。
到目前为止,我发现字节顺序在大端平台上可能是颠倒的。虽然有些平台不支持 float ,但其中包含 float
和 double
的代码甚至不会链接。否则平台似乎坚持 IEEE754 单精度和 double 。
那么假设浮点可用时在 IEEE754 中是安全的吗?
编辑:回应评论:
What is your definition of "safe"?
安全的意思是,一个系统上的位模式在另一个系统上意味着相同(在字节轮换处理字节顺序之后)。
最佳答案
基本上当前非穿孔卡使用的所有架构,包括嵌入式架构和特殊信号处理架构,都提供以下两种浮点系统之一:
- IEEE-754。
- IEEE-754 除了废话。也就是说,它们主要实现了 754,但在一些更昂贵和/或繁琐的位上便宜了。
最常见的便宜出局:
- 将非正规化归零。这使某些有时有用的定理无效(特别是如果
a
和b
在 2 的因数内,则可以精确表示a-b
的定理),但实际上这通常不会成为问题。 - 未能将
inf
和NaN
识别为特殊值。这些架构将无法遵循关于inf
和NaN
作为操作数的规则,并且可能不会饱和到inf
,而是产生大于FLT_MAX
,通常会被其他架构识别为NaN
。 - 除法和平方根的正确四舍五入。保证结果在精确结果的 1-3 ulp 以内比在 1/2 ulp 以内要容易得多。一个特别常见的情况是将除法实现为倒数+乘法,这会损失一点精度。
- 更少或没有保护数字。这是一个不寻常的便宜,但意味着其他操作可以节省 1-2 ulp。
BUUUUT...即使是那些except for blah 架构仍然使用 IEEE-754 的数字表示。除了字节顺序问题,在架构 A 上描述 float
或 double
的位基本上保证在架构 B 上具有相同的含义。
因此,只要您只关心值的表示,就完全没问题。如果您关心操作的跨平台一致性,您可能需要做一些额外的工作。
编辑:正如 Chux 在评论中提到的,平台之间不一致的一个常见额外来源是扩展精度的使用,例如 x87 的 80 位内部表示。这与廉价相反,并且(通过适当的处理)完全符合 IEEE-754 和 C 标准,但它同样会导致架构之间的结果不同,甚至编译器版本之间以及遵循明显次要和不相关的代码变化。但是:由于扩展精度,特定的 x86/x64 可执行文件不会在不同的处理器上产生不同的结果。
关于c - 假设在 C 中使用 IEEE754 float 表示 float 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31967040/