【问题标题】:float and double on different platforms [duplicate]在不同平台上浮动和加倍[重复]
【发布时间】:2013-12-30 19:32:28
【问题描述】:

所有主要开发系统(Windows、Linux 和 Mac)上的浮点数或双精度数的格式和大小是否相同?

有什么方法可以确保它们相互兼容吗?例如,我可以通过使用 int32_t 作为类型而不是 int 来确保 int 是 32 位的,但是对于 float 和 double 是否有类似的技术?

【问题讨论】:

    标签: c++ floating-point double


    【解决方案1】:

    不,没有:

    1) 格式:取决于您的架构的字节顺序

    2) 大小:double 必须不小于float。其他任何内容都是允许的。

    参见 C 标准:

    §6.2.5.10

    共有三种真正的浮点类型,分别指定为 float、double 和 长双。 float 类型的值集是 double 类型的值集; double 类型的值的集合 是 long double 类型的值集的子集。

    另见Any guaranteed minimum sizes for types in C?

    【讨论】:

    • 还有涉及最小范围和精度的约束。并且字节序不影响格式;它仅在您尝试将变量作为字节数组访问时才起作用(实际上没有任何理由这样做)。
    • @James Kanze:这是一个很好的说明,但我采用格式来表示字节排列。也许 OP 意味着尾数/指数的排列,就像我认为的那样。
    • OP实际上很可能意味着字节排列。在这种情况下,应该指出这不是真正的格式的一部分,因为我今天知道的所有机器都将floatdouble作为“单词”访问,而不是作为一个字节序列。
    • 问题指出int32_t 是整数的解决方案,所以大概字节序已经被理解或不相关。
    【解决方案2】:

    这取决于您所说的“主要开发系统”是什么意思。 Windows 和大多数 Unix 系统使用 IEEE 浮点数和双精度数,因此它们 将使用相同的格式。大多数大型机(包括 IBM)使用 其他格式。

    真正的问题是为什么需要兼容性。如果你是 担心可移植性,您不要使用int32_t,因为 仍然有一些平台不支持它。更多的 通常,在除特殊情况外的所有情况下,您都应该使用 int,并针对涉及的表达式验证输入 INT_MAXINT_MIN 确保不会发生溢出。

    【讨论】:

    • Windows、Unix 和任何其他操作系统都不能确定数据类型的存储方式。这些是编译器(确定宽度)和 CPU(确定布局)的方面,有时还有 CPU 和编译器(对于支持多种布局的架构)。
    • @mah:您可以纯粹地认为它是实现的一个特性,因此取决于编译器(可能由 CPU 通知)。或者,您可以采取实际的观点,即托管的 C++ 实现将希望向程序员公开系统 API,因此将使用操作系统的 ABI 或接近它。无论如何,就extern "C" 链接而言,这包括基本类型的布局。实用视图对程序员更有用,例如,如果您在另一种架构上模拟一种架构,则纯视图适用。
    • @mah 有点像。 Windows 仅在与 Intel 兼容的情况下运行,因此它使用 Intel 表示。 Unix 更通用,但该标准确实对架构做出了一些限制(最重要的是所有指针都具有相同的大小和表示形式),但可以存在变体的事实就是我说“大多数 Unix 系统”的原因。 (某些版本的 Unix 确实在 IBM 大型机上运行,​​但它们不使用 IEEE。我怀疑大多数 IBM 大型机运行的是 IBM 操作系统,而不是 Unix。)
    • @JamesKanze Windows 可以与英特尔紧密配对,但它仍然是标识符的错误选择。例如,MacOS 可以与 68k 紧密配对,我的意思是 PowerPC,我的意思是 Intel(让我们忽略它与运行在 ARM 上的高度相似的 iOS 姐妹)。有一些论点可以驳回该示例,因此请考虑您关于指针大小、x86 与 x86-64 的陈述,突然之间,相同的操作系统具有不同的大小。我同意,您的“最”限定词是正确的,但是当架构如此接近时,我认为没有理由引用操作系统 - 并且明确地满足其需求。
    • @SteveJessop 似乎 C++ 的实现将尊重平台 ABI 的公共元素(可能不包括 floatdouble)。似乎它还将对硬件直接支持的类型使用“本机”表示(不一定包括floatdouble)。除此之外,几乎所有事情都会发生,当然,系统 ABI 可能会自行参数化:Posix 定义了一个 ABI,其中基本类型的大小和表示只稍微指定(char 必须是 8 位等) .
    猜你喜欢
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 2010-12-10
    • 2021-01-28
    相关资源
    最近更新 更多