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:atanhl、cbrtl、copysignl、exp2l、expm1l、fdiml、fmal、fmaxl、fminl、hypotl、ilogbl、llrintl、llroundl、log1pl、log2l、logbl、lrintl、lroundl、nanl、nearbyintl、nextafterl、nexttoward、nexttowardf、nexttowardl、remainderl、remquol、rintl、roundl、scalblnl、scalbnl、tgammal 和 truncl。
实现 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