gpt4 book ai didi

c++ - C++ 编译器中存在哪些不常见的浮点大小?

转载 作者:太空狗 更新时间:2023-10-29 22:58:57 25 4
gpt4 key购买 nike

C++14 草案标准似乎对 float、double 和 long double 的具体要求相当安静,尽管这些大小似乎很常见:

  • float :IEEE 32 位浮点表示(大约 7 位精度,指数范围为 1e-38..1e+38)
  • double :IEEE 64 位浮点表示(大约 16 位精度,指数范围为 1e-308..1e+308)
  • long double :80 位浮点表示(大约 19 位精度,指数范围为 1e-4951..1e+4932)

  • 目前有哪些 C++ 编译器和系统使用除这些之外的浮点大小?

    我对使用标准类型的更长、更短和非二进制表示感兴趣,而不是库,因为我的主要兴趣是 C++ 程序的可移植性。

    最佳答案

    如果您只询问以位为单位的大小,那么奇数大小的类型仅存在于一些不使用 8 位(或 2 的另一个幂)字节的旧平台中,例如带有 36 位浮点数和 72 位 double 数的 Unisys ClearPath Dorado Servers .直到现在,那头野兽仍在积极开发中。 last version 是在 2018 年。大型机和服务器的生命周期很长,因此您仍然可以看到一些 PDP-10 and other architectures 在现代使用,并且具有现代编译器支持。但即使在较新的平台上,您仍然可以看到一些示例,例如 Intel Itanium82-bit extended float format
    如果您关心格式,那么有许多符合标准的 32、64 和 128 位浮点格式,它们不像 IBM z 中的 hex and decimal floating point typesCray formatsVAX formats 那样符合 IEEE-754。事实上,IBM z 是非常罕见的具有十进制浮点硬件的现代平台之一,尽管如果您使用 GCC 和其他一些编译器,您可以使用它们的 built-in software support for decimal float 。 IBM 还使用特殊的 double-double 格式,直到现在,它仍然是 PowerPC 上 long double 的默认格式
    在一些用于微 Controller 的现代 C/C++ 编译器中还有一些其他非标准的 24 位浮点数
    这是大部分 available floating-point formats 的摘要。另见 Do any real-world CPUs not use IEEE 754? 。有关更多信息,请继续下一节

    出于性能原因,C++ 中的类型通常映射到硬件类型。因此,如果 CPU 有 FPU,浮点类型将是 CPU 上可用的任何类型。在现代计算机中,IEEE-754 是硬件中的主要格式,由于 C++ 标准的要求,floatdouble 必须分别映射到至少 IEEE-754 singledouble 精度
    除了在 x86 和其他一些带有 80-bit extended precision 的罕见平台上,对更高精度类型的硬件支持是 不常见, 因此 long double 通常映射到与 double 在这些平台上相同的类型。然而,最近 long double 在许多编译器(如 GCC 或 Clang)中正在缓慢迁移到 IEEE-754 quadruple precision。由于是使用内置软件库实现的,因此性能要差很多。根据您是否喜欢更快的执行或更高的精度,您仍然可以自由选择 long double 映射到的任何类型。例如在 x86 GCC 上有 -mlong-double-64/80/128 and -m96/128bit-long-double options 来设置 long double 的填充和格式。该选项也可用于许多其他架构,如 S/390 and zSeries
    PowerPC OTOH 默认使用 完全不同的 128 位长 double 格式 使用 double-double arithmetic 实现并且具有与 IEEE-754 double 相同的范围。它的精度略低于四倍精度,但速度要快得多,因为它可以利用硬件 double 算法。如上所述,您可以使用 -mabi=ibmlongdouble/ieeelongdouble options 在 2 种格式之间进行选择。该技巧也用于一些 platforms where only 32-bit float is supported 以获得接近 double
    IBM z 大型机传统上使用 IBM hex float formats,现在仍在使用。但除此之外,他们还有 support IEEE-754 binary and decimal floating-point types

    The format of floating-point numbers can be either base 16 S/390® hexadecimal format, base 2 IEEE-754 binary format, or base 10 IEEE-754 decimal format. The formats are based on three operand lengths for hexadecimal and binary: short (32 bits), long (64 bits), and extended (128 bits). The formats are also based on three operand lengths for decimal: _Decimal32 (32 bits), _Decimal64 (64 bits), and _Decimal128 (128 bits).

    Floating-point numbers


    其他架构可能有其他浮点格式,如 VAX 或 Cray。然而,由于这些大型机仍在使用中,它们较新的硬件版本也包括对 IEEE-754 的支持,就像 IBM 对大型机所做的那样
    在没有 FPU 的现代平台上,浮点类型通常是 IEEE-754 单精度和 double ,以获得更好的互操作性和库支持。然而,在 8 位微 Controller 上,即使是单精度也太昂贵了,因此一些编译器支持非标准模式,其中 float 是 24 位类型。例如,XC8 编译器使用 24-bit floating-point format,它是 32 位格式的截断形式,而 NXP's MRK uses a different 24-bit float format
    由于需要更窄浮点类型的图形和 AI 应用程序的兴起,许多平台也引入了 16 位浮点格式,如 IEEE-754 binary16 和 Google 的 bfloat16,编译器也对它们有一些有限的支持,如 __fp16 in GCC

    关于c++ - C++ 编译器中存在哪些不常见的浮点大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38509009/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com