首选量子指数
十进制浮点数(x)通过以下模型定义:
其中:s为符号(±1)。
e为指数(一个介于最小指数emin和最大指数emax之间的整数。)。
p为精度(有效数中基数10的位数。)。
fk为小于10的非负整数(有效数字,有效数字为0、1、2、3、4、5、6、7、8、9。)。
对于每种浮点类型,p、emin和emax都是固定常量。
量子指数(quantum exponent)q = e - p;系数(coefficient)c = f1f2···fp是值位于[0,10p-1]区间范围内的整数;因此十进制浮点数x = s·c·10q可使用整数三元组(s,c,q)表示。x的量子(quantum)是10q,即系数中最低位的单位值。
不同十进制浮点类型的量子指数范围如下表所示:
| 类型 | _Decimal32 | _Decimal64 | _Decimal128 |
| 最大量子指数(qmax) | 90 | 369 | 6111 |
| 最小量子指数(qmin) | -101 | -398 | -6176 |
对于遵循ISO/IEC 60559标准的二进制浮点算术,符合标准浮点类型描述模型、数值相同的表示形式,在算术运算中是无法区分的,例如:1.0和1.000;但在十进制浮点算术中,即使数值相同、但量子指数不同的表示形式是可以区分的,例如:(+1,10,−1)表示1.0,(+1,1000,−3)表示1.000,两者数值相同,但量子指数不同,因此在算术系统中视为可区分的表示形式。
为便于精确定点计算,十进制浮点类型的运算结果存在一个首选量子指数(preferred quantum exponent),该量子指数按ISO/IEC 60559标准规定的规则确定:如果操作数具有十进制浮点类型(包括按特定规则从其它类型转换而来。),首选量子指数由操作数的量子指数决定。
下表列出了用于确定按ISO/IEC 60559标准运算以及ISO/IEC 9899:2024标准规定的其它运算结果的首选量子指数的规则。
| 操作 | 结果首选量子指数 |
| roundeven,round,trunc, ceil,floor,rint,nearbyint |
,即和中的较大者。 |
| nextup,nextdown,nextafter,nexttoward | 最小可能值。 |
| remainder | ,即和中的较小者。 |
| fmin,fmax,fminimum,fmaximum, fminimum_mag,fmaximum_mag, fminimum_num,fmaximum_num, fminimum_mag_num,fmaximum_mag_num |
如果结果是,则是;如果结果是,则是。 |
| scalbn,scalbln | |
| ldexp | |
| logb | |
| ++(包括前缀和后缀) --(包括前缀和后缀) |
,即和中的较小者。 |
| +,d32add,d64add | ,即和中的较小者。 |
| -,d32sub,d64sub | ,即和中的较小者。 |
| *,d32mul,d64mul | |
| /,d32div,d64div | |
| sqrt,d32sqrt,d64sqrt | |
| fma,d32fma,d64fma | |
| 从整数类型进行的转换操作 | |
| 从非十进制浮点类型进行的精确转换操作 | |
| 从非十进制浮点类型进行的不精确转换操作 | 最小可能值。 |
| 十进制浮点类型之间的相互转换 | |
| canonicalize函数返回的*cx | |
| strto,wcsto,scanf, 十进制浮点常量 |
有限转换十进制浮点数的系数和量子指数按以下规则确定: --如果指数部分存在位序列(符号可选。),则将设置为指数部分的位序列值;否则设置为。 --如果存在小数部分,值应减去小数点右侧的位数,同时将小数点移除形成数字序列。 --系数设置为移除小数点后数字序列所表示的值。 --当结果类型因精度或者范围不足而需要舍入时,系数将舍入到结果类型所能提供的完整精度,并在类型限制范围内调整量子指数,前提是舍入不会产生无穷大(如果舍入产生无穷大,则结果是带有适当符号的无穷大内部表示)。如果该类型的完整精度要求小于类型允许的最小值,那么将固定在最小值,系数在次正规格化数范围内相应调整,甚至可能调整为。 |
| -(x),+(x) | |
| fabs | |
| copysign | |
| quantize | |
| quantum | |
| encodedec、encodebin函数返回的*encptr | |
| decodedec、decodebin函数返回的*xptr | |
| fmod | |
| fdim | 如果,则是; 如果,则是。 |
| cbrt | |
| hypot | |
| pow | |
| modf | |
| modf函数返回的*iptr | |
| frexp | 如果等于,则是; 否则是–(value的系数长度)。 |
| setpayload、setpayloadsig函数返回的*res | 如果pl不表示有效载荷(payload),则是; 否则不适用,返回非数值(NaN)。 |
| getpayload | 如果是非数值(NaN),则是;否则未指定。 |
| compoundn | |
| pown | |
| powr | |
| rootn | |
| rsqrt | |
| 超越函数(transcendental functions) |
上表中的表示实参的量子指数;其中的函数表示对应的函数组,包括适用于十进制浮点类型的所有函数,例如:pow表示powd32、powd64、powd128等函数。
当运算精确时,结果具有首选量子指数或者在类型限制范围内尽可能接近首选量子指数。当运算不精确时,结果具有最小可能的量子指数。
加法的首选量子指数是两个操作数量子指数中较小的那个,例如:(+1,123,−2)+(+1,4000,−3)=(+1,5230,−3),即1.23+4.000=5.230。
对于函数文档中未定义并且函数结果为±∞的情况,首选量子指数无关紧要,因为±∞的量子指数定义为无穷大。
对于函数文档中未定义并且函数结果为有限值的其它情况,首选量子指数未作规定。
虽然在ISO/IEC 60559标准中未作规定,但在函数文档中未定义并且函数结果为有限值的情况下,将首选量子指数设为0是个合理的现实选择。
主要参考资料: