如何确保跨平台的浮点大小相同?
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) == 4
和 sizeof(double) == 8
,但依赖它绝对是危险的。
不同的机器可以不同地存储相同的值。它们可能使用不同的浮点格式,或者它们都使用 IEEE 754。即使它们都使用 IEEE 754,它们也可能以 big-endian 或 little-endian 顺序存储它们。
您必须决定为什么您认为它们的大小必须相同。很有可能,您正试图在不同机器之间中继信息时采取一些无根据的捷径。不要走捷径;他们会在某个时候将您带入问题。如果您觉得必须,您必须评估您的可移植性目标到底是什么,并验证您是否可以通过您提出的设计来满足这些目标。但要非常小心!
【讨论】:
请注意,sizeof(float) == 4
也不意味着 32 位。
是的,但是您最后一次在 CHAR_BIT 不是 8 的机器上工作是什么时候?通常,如果您必须与此类机器打交道,您可能已经知道这些问题,并且不需要首先提出问题。以上是关于如何确保跨平台的浮点大小相同?的主要内容,如果未能解决你的问题,请参考以下文章