128 位长整型双精度浮点数据类型

AIX操作系统支持 128 位长双数据类型,其精度高于默认的 64 位长双数据类型。 128 位的数据类型 能够处理最多 31 位有效数字(与 64 位双精度长整型的 17 位相比)。 但是,该数据类型 虽然能够比 64 位的数据类型以更高的精度存储数字,却不能存储量级更高的数字。

以下的特殊事项要应用于 128 位长整型双精度数据类型:

  • 编译使用 128 位长整型双精度数据类型的程序
  • 与 IEEE 754 标准一致
  • 实现 128 位长整型双精度格式
  • 数字宏的值

编译使用 128 位长整型双精度数据类型的程序

要编译使用 128 位长整型双精度数据类型的 C 程序, 请使用 xlc128 命令。 此命令是支持 128 位数据类型的 xlc 命令的别名。 xlc 命令 仅支持 64 位长整型双精度数据类型。

标准 C 库 libc.a 可用以 替代对长整型双精度数据的大小隐式敏感的 libc.a 例程。 请在编译使用 64 位长整型双精度数据类型的应用程序时链接 libc.a 库。 将使用 128 位长整型双精度值的应用程序与 libc128.a 以及 libc.a 库链接。 链接时,请确保在指定库搜索顺序时,先指定 libc128.a 库再指定 libc.a 库。

与 IEEE 754 标准一致

64 位长整型双精度数据类型的实现完全与 IEEE 754 标准一致, 但 128 位的实现则不与之一致。 请对那些必须符合 IEEE 754 标准的应用程序使用 64 位实现。

对于长整型双精度数据类型,128 位实现在以下方面不同于 IEEE 标准:

  • 仅支持最近舍入方式。 如果应用程序更改了舍入方式,那么结果将无法确定。
  • 不完全支持 IEEE 特殊数字 NaN 和 INF。
  • 不支持 IEEE 溢出、下溢以及其他情况的状态标记。 这些标记对于 128 位长整型双精度数据类型的实现没有意义。
  • 128 位长整型双精度数据类型不支持下列数学 API:atanhlcbrtlcopysignlexp2lexpm1lfdimlfmalfmaxlfminlhypotlilogblllrintlllroundllog1pllog2llogbllrintllroundlnanlnearbyintlnextafterlnexttowardnexttowardfnexttowardlremainderlremquolrintlroundlscalblnlscalbnltgammaltruncl

实现 128 位长整型双精度格式

128 位长整型双精度数由一对有序的 64 位双精度数组成。 该有序数对的第一部分是数字的高位,第二部分是低位部分。 长整型双精度的数量的值是两个 64 位数之和。

两个 64 位数中的每一个其自身都是一个有符号、指数以及有效数字的双精度浮点数。 低阶成员在高部分的最后一个位置具有小于 1 单位的量级,因此两个 64 位数字的值不会重叠,并且低阶数字的整个显着性和整个显着性会使精度超出高阶数字。

这种表示使得在使用这些数字时必须考虑以下若干问题:

  • 128 位长双数据类型的精度大于双数据类型的精度,但指数范围相同。 因此,使用 128 位长双精度数据类型表示的数字量级略大于 64 位双精度数据类型的量级。
  • 因为量级的绝对值减少了(接近非正常范围), 所以低位部分的附加精度也将减少。 当要表示的值处于非正常范围时,那么此表示法的精度不会超出 64 位双精度数据类型的精度。
  • 精度的实际位数可能会有所不同。 如果低位部分远小于高位部分的 1 ULP,那么会在高位有效数字和低位有效数字隐含有效位(全 0 或全 1)。 依赖于在有效位数中有固定位数的某些算法在使用 128 位长整型双精度数的时候可能会失败。

数字宏的值

由于长整型双精度数据类型的存储方法,多个数字 能符合作为宏的特定值的要求。128 位长整型双精度数的表示方法意味着以下这些 values.h 文件中的标准 C 所需的宏没有明确的含义:

  • 尾数中的位数 (LDBL_MANT_DIG)
  • Epsilon (LBDL_EPSILON)
  • 可表示的最大有限值 ( LDBL_MAX)

mantissa 中的位数

有效数的位数不是固定的,但对于一个格式正确的数(非正常范围内的除外), 最少位数为 106。 因此,LDBL_MANT_DIG 宏的值为 106。

EPSILON

ANSI C 标准将 epsilon 的值定义为 1.0 和大于 1.0 的 可表示最小值之间的差,即 b**(1-p), 其中 b 是基 (2),p 是数值中基数 b 的数目。 此定义要求基数 b 的数目是固定的,这对于 128 位长整型双精度数是无法做到的。

大于 1.0 的可表示最小值是此数字:

0x3FF0000000000000, 0x0000000000000001

此值和 1.0 之间的差是此数字:

0x0000000000000001, 0x0000000000000000
0.4940656458412465441765687928682213E-323

由于 128 位数通常提供了至少 106 位的精度, 所以对于 p 的相应的最小值是 106。 因此,b**(1-p) 和 2**(-105) 会产生此值:

0x3960000000000000, 0x0000000000000000
0.24651903288156618919116517665087070E-31

根据标准 C ,这两个值都满足 epsilon 的定义。 长整型双子例程使用第二个值,因为它可以更好地描述 128 位实现所提供的准确性。

最大长整型双精度值

LDBL_MAX 宏的值是可乘以 1.0 并 产生原始数字的最大的 128 位长整型双精度数。 此值同时也是原运算(比如乘法和除法)可生成的最大有限值:

0x7FEFFFFFFFFFFFFF, 0x7C9FFFFFFFFFFFFF
0.1797693134862315907729305190789002575e+309