浮点是在 C 中定义的实现。因此没有任何保证。
我们的代码需要可移植,我们正在讨论是否可以在我们的协议中使用 IEEE754 浮点。出于性能原因,如果我们在发送或接收数据时不必在定点格式之间来回转换,那就太好了。
虽然我知道平台和架构之间在大小方面可能存在差异long
or wchar_t
。但我似乎找不到任何具体的float
and double
.
到目前为止我发现字节顺序可能在大端平台上颠倒。虽然有些平台不支持浮点,但其中的代码包含float
and double
甚至不会链接。否则平台似乎坚持 IEEE754 单精度和双精度。
那么可以安全地假设浮点在 IEEE754 中可用吗?
编辑:回应评论:
你对“安全”的定义是什么?
我所说的安全是指,一个系统上的位模式在另一个系统上意味着相同的位模式(在字节旋转处理字节序之后)。
基本上当前非打孔卡使用的所有架构,包括嵌入式架构和奇异信号处理架构,都提供以下两种浮点系统之一:
- IEEE-754。
- IEEE-754除了废话。也就是说,他们mostly实现 754,但在一些更昂贵和/或复杂的位上便宜。
最常见的低价促销:
- 刷新非规格化为零。这使得某些有时有用的定理(特别是以下定理)无效:
a-b
可以精确地表示,如果a
and b
都在 2 的范围内),但实际上这通常不会成为问题。
- 无法识别
inf
and NaN
作为特别的。这些架构将无法遵循有关的规则inf
and NaN
作为操作数,并且可能不会饱和inf
,而不是产生大于FLT_MAX
,通常会被其他架构识别为NaN
.
- 除法和平方根的正确舍入。保证结果在准确结果的 1-3 ulp 范围内比在 1/2 ulp 范围内要容易得多。一个特别常见的情况是将除法实现为倒数+乘法,这会损失一点精度。
- 更少或没有保护数字。这是一个不同寻常的便宜,但意味着其他操作可以节省 1-2 ulps。
但是……即使是那些除了废话架构仍然使用 IEEE-754 的数字表示形式。除了字节顺序问题之外,描述一个float
or double
架构 A 上的含义本质上保证在架构 B 上具有相同的含义。
因此,只要您关心的是价值观的表达,就完全没问题。如果您关心操作的跨平台一致性,您可能需要做一些额外的工作。
EDIT:正如 Chux 在评论中提到的,平台之间不一致的一个常见额外来源是使用扩展精度,例如 x87 的 80 位内部表示。这与廉价相反,并且(经过适当处理)完全符合 IEEE-754 和 C 标准,但它同样会导致架构之间、甚至编译器版本之间以及以下明显次要且不相关的代码之间的结果不同变化。但是:由于扩展的精度,特定的 x86/x64 可执行文件不会在不同的处理器上产生不同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)