当前位置: 首页 > 知识库问答 >
问题:

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

高慈
2023-03-14

C 14标准草案似乎对浮动、双倍和长双倍的具体要求相当沉默,尽管这些尺寸似乎很常见:

>

  • 浮点:IEEE 32位浮点表示(大约7位精度,指数范围为1e-38..1e 38)

    双精度:IEEE 64位浮点表示(大约16位精度,指数范围为1e-308..1e 308)

    长双精度:80位浮点表示(大约19位精度,指数范围为1e-4951...1e 4932)

    除此之外,目前哪些C编译器和系统使用浮点大小?

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

  • 共有3个答案

    公冶嘉茂
    2023-03-14

    浮点和双精度实际上是IEEE单精度和双精度表示的标准。我将假设这些大小与假设CHAR\u位==8属于同一类别。一些旧的ARM系统确实有奇怪的“混合端”双打,但除非你使用复古的东西,否则你现在不太可能遇到这种情况。

    另一方面,长双精度的变化要大得多。有时是IEEE双精度,有时是80位x87扩展,有时是IEEE四精度,有时是由两个IEEE双精度数字相加而成的“双-双”格式。

    所以在可移植代码中,你不能指望长双精度比双精度好。

    夔光霁
    2023-03-14

    首先,我对堆栈溢出是新手,所以请容忍我。

    然而,回答你的问题。看着浮子。h标头,用于指定以下项的浮点参数

    >

  • 英特尔编译器

    //Float:
    #define FLT_MAX                 3.40282347e+38F
    
    //Double:
    #define DBL_MAX                 1.7976931348623157e+308
    
    //Long Double:
    #if (__IMFLONGDOUBLE == 64) || defined(__LONGDOUBLE_AS_DOUBLE)
    #define LDBL_MAX                    1.7976931348623157e+308L
    #else
    #define LDBL_MAX                1.1897314953572317650213E+4932L
    

    GCC(MinGW实际上是gcc 4或5)

    //Float:
    #define FLT_MAX         3.40282347e+38F
    
    //Double:
    #define DBL_MAX     1.7976931348623157e+308
    
    //Long Double: (same as double for gcc):
    #define LDBL_MAX        1.7976931348623157e+308L
    

    微软

    //Float:
    #define FLT_MAX         3.40282347e+38F
    
    //Double:
    #define DBL_MAX     1.7976931348623157e+308
    
    //Long Double: (same as double for Microsoft):
    #define LDBL_MAX            DBL_MAX
    

    因此,正如您所看到的,只有英特尔编译器在“标准”Windows机器上为long Double提供了80位表示。

    该数据从相应的浮点中复制。h来自Windows计算机的标题。

  • 茅桐
    2023-03-14

    不清楚你在说什么“不寻常的尺寸”

    >

  • 如果您只询问以位为单位的大小,那么“奇数大小”(即不是2的幂)类型通常存在于不使用8位(或2的幂)字节的旧平台中

    一个例子是Unisys ClearPath Dorado服务器,具有36位浮点和72位双精度。到目前为止,这头野兽仍在积极发展中。最后一个版本是在2018年。大型机和服务器的使用寿命很长,因此您仍然可以看到现代使用的一些PDP-10和其他架构,以及现代编译器支持。

    但即使在较新的平台上,您仍然可以看到一些示例,如Intel Itanium的82位扩展浮点格式。许多平台也使用40位浮点格式。这在许多使用40位累加器的现代DSP中尤其常见,如TI C3x/C4x、SHARC ADSP-21160、Atmel TSC21020F。还有许多旧的40位浮点格式,如IBM扩展格式或Microsoft MBF扩展格式。另请参阅为什么8位Basic使用40位浮点?

    此外,在一些用于微控制器的现代C/C编译器中,还有一些其他非标准的24位浮点。在计算机图形学中,除了16位和24位浮点之外,许多微浮点格式(如10位或11位浮点)也不是未知的

    如果您关心格式,那么有许多符合标准的32、64和128位浮点格式不是IEEE-754,就像IBM z、Cray格式和VAX格式中的十六进制和十进制浮点类型一样。

    事实上,IBM z是具有十进制浮点硬件的非常罕见的现代平台之一,尽管如果您使用GCC和其他一些编译器,您可以使用其对十进制浮点的内置软件支持。IBM还使用了特殊的double-double格式,到目前为止,它仍然是PowerPC上长double的默认格式

    以下是大多数可用浮点格式的摘要。请参阅是否有任何实际CPU未使用IEEE 754?。有关更多信息,请继续下一节

    出于性能原因,C中的类型通常映射到硬件类型。因此,如果CPU有FPU,浮点类型将是CPU上可用的任何类型。在现代计算机中,IEEE-754是硬件的主要格式,并且由于C标准浮点和双精度的要求,必须分别映射到至少IEEE-754单精度和双精度

    除了在x86和其他少数具有80位扩展精度的罕见平台上,对更高精度类型的硬件支持并不常见,因此long Double通常映射到与这些平台上的Double相同的类型。然而,最近long Double正在GCC或Clang等许多编译器中慢慢迁移到IEEE-754四重精度。由于该版本是使用内置软件库实现的,因此性能要差得多。根据您喜欢更快的执行还是更高的精度,您仍然可以自由选择long Double映射到的任何类型。例如,在x86上,GCC有-mlong-dule-64/80/128-m96/128 bit-long-Double选项来设置long Double的填充和格式。该选项也可用于许多其他架构,如S/390和zSeries

    PowerPC OTOH默认使用完全不同的128位长双精度格式,使用双精度算法实现,并且与IEEE-754双精度范围相同。它的精度略低于四倍精度,但速度要快得多,因为它可以利用硬件双精度。如上所述,您可以使用-mabi=ibmlong Double/ieelong Double选项在2种格式之间进行选择。该技巧也用于某些仅支持32位浮点数以获得接近双精度的平台

    IBMz大型机传统上使用IBM十六进制浮点格式,现在仍然使用它。但除此之外,它们还支持IEEE-754二进制和十进制浮点类型

    浮点数的格式可以是基16 S/390®十六进制格式、基2 IEEE-754二进制格式或基10 IEEE-754十进制格式。格式基于十六进制和二进制的三个操作数长度:短(32位)、长(64位)和扩展(128位)。格式还基于十进制的三个操作数长度:_Decimal32(32位)、_Decimal64(64位)和_Decimal128(128位)。

    浮点数

    其他架构可能有其他浮点格式,如VAX或Cray。然而,由于这些大型机仍在使用,它们的新硬件版本也包括对IEEE-754的支持,就像IBM对它们的大型机所做的那样

    在没有FPU的现代平台上,浮点类型通常是IEEE-754单精度和双精度,以获得更好的互操作性和库支持。然而,在8位微控制器上,即使是单精度也太昂贵,因此一些编译器支持非标准模式,其中浮点是24位类型。例如,XC8编译器使用24位浮点格式,它是32位格式的截断形式,而NXP的MRK使用不同的24位浮点格式

    由于需要更窄浮点类型的图形和AI应用程序的兴起,许多平台也引入了IEEE-754 binary16和Google的bFloat16等16位浮点格式,编译器对它们的支持也很有限,例如GCC中的__fp16

  •  类似资料:
    • 主要内容:桌面操作系统,嵌入式系统在上节《 C语言编译和链接》中我们已经讲解了C语言编译器的概念,由于C语言的历史比较久,而且早期没有规范,整个计算机产业也都处于拓荒的年代,所以就涌现了很多款C语言编译器,它们各有特点,适用于不同的平台,本节就来给大家科普一下。 我们分两部分介绍C语言的编译器,分别是桌面操作系统和嵌入式操作系统。 桌面操作系统 对于当前主流桌面操作系统而言,可使用 Visual C++、 GCC 以及 LLVM

    • 本文向大家介绍常见的异常类有哪些?相关面试题,主要包含被问及常见的异常类有哪些?时的应答技巧和注意事项,需要的朋友参考一下 NullPointerException 空指针异常 ClassNotFoundException 指定类不存在 NumberFormatException 字符串转换为数字异常 IndexOutOfBoundsException 数组下标越界异常 ClassCastExce

    • 有问题的代码如下: 编译器会优化它吗?根据C-Standard(如果我理解正确的话),第二个操作数必须提升为;因此乘法必须使用FPU(或fp仿真)完成。 从理论上讲,该操作可以在正常的硬件寄存器中完成,只需添加一个即时的(并且可能是溢出检查)。是否允许编译器执行此优化?是否有已知的编译器这样做?如果是这样,他们是否也会识别该表达式 这是避免有关隐式转换的静态代码检查器警告所必需的? 补充一下:我知

    • NullPointerException:空指针异常; SQLException:数据库相关的异常; IndexOutOfBoundsException:数组下角标越界异常; FileNotFoundException:打开文件失败时抛出; IOException:当发生某种IO异常时抛出; ClassCastException:当试图将对象强制转换为不是实例的子类时,抛出此异常; NoSuchM

    • 下面列出了一些在使用TypeScript语言和编译器过程中常见的容易让人感到困惑的错误信息。 "tsc.exe" exited with error code 1 修复: 检查文件编码,确保为UTF-8 - https://typescript.codeplex.com/workitem/1587 external module XYZ cannot be resolved 修复: 检查模块路径是

    • 本文向大家介绍常见的PHP框架有哪些?相关面试题,主要包含被问及常见的PHP框架有哪些?时的应答技巧和注意事项,需要的朋友参考一下 答:thinkPHP、laravel、yii、ci 等。