如何确保跨平台的浮点大小相同?

Posted

技术标签:

【中文标题】如何确保跨平台的浮点大小相同?【英文标题】:How to make sure the size of a floating point is the same across platforms? 【发布时间】:2011-09-24 23:07:00 【问题描述】:

我正在编写必须在不同平台上运行的软件。它使用浮点数。在所有平台上,浮点数在内存中的大小必须相同。

例如,对于整数,我可以使用int32_t。我怎样才能对浮点数执行此操作?

【问题讨论】:

为什么它们的尺寸必须相同? @yi_H 它们存储在磁盘上的文件中。 将 sizeof(double) 与常量进行比较 @WTP:好吧,理论上它们仍然可以是不同的表示形式。 这个文件包含二进制格式的浮点数?如果它是 ASCII,无论您使用什么函数来读取它们(例如 atof)都应该注意不同的浮点大小。 【参考方案1】:

如果您需要将值强制为相同大小,您可以设计一个仅使用已知大小的整数的表示。您可以将浮点数转换为该格式以保存它们,并在读取它们时将它们转换回浮点数。

参见how can I extract the mantissa of a double AProgrammer 对frexp() 函数的解释,该函数会将浮点数分解为其(整数)指数和(双)尾数。该答案后面的 cmets 将解释如何将尾数转换为整数。

您可以保存整数尾数和指数,它们将具有固定长度。然后你可以读回它们并使用ldexp() 函数重新创建原始浮点数(当然会有一些小错误)。

【讨论】:

+1,如果您需要存储它们,请务必使用特殊情况的无穷大和 nans 进行存储..【参考方案2】:

你不能在 C 中进行移植;你必须接受系统提供的东西。

也就是说,在我所知道的所有系统上,sizeof(float) == 4sizeof(double) == 8,但依赖它绝对是危险的。

不同的机器可以不同地存储相同的值。它们可能使用不同的浮点格式,或者它们都使用 IEEE 754。即使它们都使用 IEEE 754,它们也可能以 big-endian 或 little-endian 顺序存储它们。

您必须决定为什么您认为它们的大小必须相同。很有可能,您正试图在不同机器之间中继信息时采取一些无根据的捷径。不要走捷径;他们会在某个时候将您带入问题。如果您觉得必须,您必须评估您的可移植性目标到底是什么,并验证您是否可以通过您提出的设计来满足这些目标。但要非常小心!

【讨论】:

请注意,sizeof(float) == 4 也不意味着 32 位。 是的,但是您最后一次在 CHAR_BIT 不是 8 的机器上工作是什么时候?通常,如果您必须与此类机器打交道,您可能已经知道这些问题,并且不需要首先提出问题。

以上是关于如何确保跨平台的浮点大小相同?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Windows和Linux上确保相同的浮点行为?

Java strictfp

使用 C:如何确定浮点组件的大小?

有没有办法保证浮点计算的跨平台回归测试的结果?

Google 的 Protocol Buffer 在实践中处理浮点类型的跨平台程度如何?

windows 地址空间分配