精度转换
二进制精度舍入规则
在了解不同类型之间的精度转换规则之前,需先了解二进制的精度舍入规则。
如下图所示,一个二进制数的尾部若干位可能因目标精度不足而被丢弃,这部分称为待舍入部分;剩余保留的部分称为非舍入部分。根据待舍入部分的值以及所选的精度舍入模式,决定非舍入部分的末位是否需要 +1(进位)。

各精度舍入模式对待舍入部分的判断规则如下表所示:
| 模式 | 描述 |
|---|---|
| CAST_NONE | 当转换过程存在精度损失时,按CAST_RINT模式处理;当不存在精度损失时,不进行舍入。 |
| CAST_RINT | 向最近的偶数舍入。 •若待舍入部分的首位为0,则不进位。 •若待舍入部分的首位为1且后续位不全为0,则进位。 •若待舍入部分的首位为1且后续位全为0:当非舍入部分的末位为0,则不进位;当非舍入部分的末位为1,则进位。 |
| CAST_FLOOR | 向负无穷大方向舍入。 •若符号位(S)为0(正数),则不进位。 •若符号位(S)为1(负数):当待舍入部分全为0,则不进位;否则,进位。 |
| CAST_CEIL | 向正无穷大方向舍入。 •若符号位(S)为1(负数),则不进位。 •若符号位(S)为0(正数):当待舍入部分全为0,则不进位;否则,进位。 |
| CAST_ROUND | 四舍五入。若待舍入部分的首位为0,则不进位;否则,进位。 |
| CAST_TRUNC | 截断模式。直接丢弃待舍入部分。 |
| CAST_ODD | 向最近的奇数舍入。 •若待舍入部分全为0,则不进位。 •若待舍入部分不全为0:非舍入部分的末位为1,则不进位;当非舍入部分的末位为0,则进位。 |
| CAST_HYBRID | 随机舍入,目前特指输出结果是hifloat8_t数据类型时,会用到的一种随机舍入。 |
精度转换规则
本节主要对不同数据类型之间精度转换时的舍入行为进行介绍。不同数据类型的表示方式请参考内置数据类型。当源值超出目标类型的表示范围时溢出,溢出默认按照饱和模式处理。
int4b_t → int16_t
将源值以int16_t格式存入目的操作数中,无精度损失。
示例:输入:1,输出:1。
int4b_t → half
将源值以half格式存入目的操作数中,无精度损失。
示例:输入:1,输出:1.0。
int4b_t → bfloat16_t
将源值以bfloat16_t格式存入目的操作数中,无精度损失。
示例:输入:1,输出:1.0。
int8_t → half
将源值以half格式存入目的操作数中,无精度损失。
示例:输入:-1,输出:-1.0。
int8_t → int16_t
将源值以int16_t格式存入目的操作数中,无精度损失。
示例:输入:27−12^7 - 1,输出:27−12^7 - 1。
int8_t → int32_t
将源值以int32_t格式存入目的操作数中,无精度损失。
示例:输入:27−12^7 - 1,输出:27−12^7 - 1。
uint8_t → half
将源值以half格式存入目的操作数中,无精度损失。
示例:输入:1,输出:1.0。
uint8_t → uint16_t
将源值以uint16_t格式存入目的操作数中,无精度损失。
示例:输入:28−12^8 - 1,输出:28−12^8 - 1。
uint8_t → uint32_t
将源值以uint32_t格式存入目的操作数中,无精度损失。
示例:输入:28−12^8 - 1,输出:28−12^8 - 1。
fp4x2_e2m1_t → bfloat16_t
将源值以bfloat16_t格式存入目的操作数中,无精度损失。
示例:输入:2,输出:2。
fp4x2_e1m2_t → bfloat16_t
将源值以bfloat16_t格式存入目的操作数中,无精度损失。
示例:输入:2,输出:2。
hifloat8_t → float
将源值以float格式存入目的操作数中,无精度损失。
示例:输入:2,输出:2。
hifloat8_t → half
将源值以half格式存入目的操作数中,无精度损失。
示例:输入:2,输出:2。
fp8_e5m2_t → float
将源值以float格式存入目的操作数中,无精度损失。
示例:输入:2,输出:2。
fp8_e4m3fn_t → float
将源值以float格式存入目的操作数中,无精度损失。
示例:输入:2,输出:2。
int16_t → int4b_t
将源值以int4b_t格式存入目的操作数中。
示例:输入:215−12^{15} - 1,输出:23−12^3 - 1。
int16_t → uint8_t
将源值以uint8_t格式存入目的操作数中,高位截断,存在精度损失。负数输入会被视为异常。
示例:输入:215−12^{15} - 1,输出:28−12^8 - 1。
int16_t → half
将源值按照精度舍入模式取到half所能表示的数,以half格式存入目的操作数中。
示例:输入:212+22^{12} + 2,写成half的表示形式:212×(1+2−11)2^{12} \times (1 + 2^{-11}),要求Ev=12+15=27E_v = 12 + 15 = 27,Mv=2−11M_v = 2^{-11}。
图2 int16_t转half

由于half只有10bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式输入得尾数
0000000000,Ev=27E_v = 27,Mv=0M_v = 0,最终结果为:2122^{12}。 - CAST_FLOOR模式输入得尾数
0000000000,Ev=27E_v = 27,Mv=0M_v = 0,最终结果为:2122^{12}。 - CAST_CEIL模式舍入得尾数
0000000001,Ev=27E_v = 27,Mv=2−10M_v = 2^{-10},最终结果为:212+42^{12} + 4。 - CAST_ROUND模式舍入得尾数
0000000001,Ev=27E_v = 27,Mv=2−10M_v = 2^{-10},最终结果为:212+42^{12} + 4。 - CAST_TRUNC模式舍入得尾数
0000000000,Ev=27E_v = 27,Mv=0M_v = 0,最终结果为:2122^{12}。
int16_t → uint32_t
将源值以uint32_t格式存入目的操作数中,无精度损失。负数输入会默认转换成0。
示例:输入:215−12^{15} - 1,输出:215−12^{15} - 1。
int16_t → int32_t
将源值以int32_t格式存入目的操作数中,无精度损失。
示例:输入:215−12^{15} - 1,输出:215−12^{15} - 1。
int16_t → float
将源值以float格式存入目的操作数中,无精度损失。
示例:输入:215−12^{15} - 1,输出:215−12^{15} - 1。
uint16_t → uint8_t
将源值以uint8_t格式存入目的操作数中。
示例:输入:216−12^{16} - 1,输出:28−12^8 - 1。
uint16_t → uint32_t
将源值以uint32_t格式存入目的操作数中,无精度损失。
示例:输入:216−12^{16} - 1,输出:216−12^{16} - 1。
half → int4b_t
将源值按照精度舍入模式取整,以int4b_t格式存入目的操作数中。
示例:输入:1.51.5,小数部分需要舍入。
- CAST_RINT模式输出:22。
- CAST_FLOOR模式输出:11。
- CAST_CEIL模式输出:22。
- CAST_ROUND模式输出:22。
- CAST_TRUNC模式输出:11。
half → int8_t
将源值按照精度舍入模式取整,以int8_t格式存入目的操作数中。
示例:输入:27−0.52^{7} - 0.5。
- CAST_RINT模式输出:27−12^{7} - 1(溢出处理)。
- CAST_FLOOR模式输出:27−12^{7} - 1。
- CAST_CEIL模式输出:27−12^{7} - 1(溢出处理)。
- CAST_ROUND模式输出:27−12^{7} - 1(溢出处理)。
- CAST_TRUNC模式输出:27−12^{7} - 1。
half → uint8_t
将源值按照精度舍入模式取整,以uint8_t格式存入目的操作数中。负数输入会被视为异常。
示例:输入:1.751.75。
- CAST_RINT模式输出:22。
- CAST_FLOOR模式输出:11。
- CAST_CEIL模式输出:22。
- CAST_ROUND模式输出:22。
- CAST_TRUNC模式输出:11。
half → hifloat8_t
将源值按照精度舍入模式取整,以hifloat8_t格式存入目的操作数中。
示例:输入:1.751.75。
- CAST_ROUND模式输出:22。
- CAST_HYBRID模式,参考half to hifloat8_t类型转换规则的输出。
half → int16_t
将源值按照精度舍入模式取整,以int16_t格式存入目的操作数中。
示例:输入:27−0.52^{7} - 0.5。
- CAST_RINT模式输出:272^{7}。
- CAST_FLOOR模式输出:27−12^{7} - 1。
- CAST_CEIL模式输出:272^{7}。
- CAST_ROUND模式输出:272^{7}。
- CAST_TRUNC模式输出:27−12^{7} - 1。
half → bfloat16_t
将源值按照精度舍入模式取整,以bfloat16_t格式存入目的操作数中。
示例:输入:1.751.75。
- CAST_RINT模式输出:22。
- CAST_FLOOR模式输出:11。
- CAST_CEIL模式输出:22。
- CAST_ROUND模式输出:22。
- CAST_TRUNC模式输出:11。
half → int32_t
将源值按照精度舍入模式取整,以int32_t格式存入目的操作数中。
-
示例:输入:−1.5-1.5。
- CAST_RINT模式输出:−2-2。
- CAST_FLOOR模式输出:−2-2。
- CAST_CEIL模式输出:−1-1。
- CAST_ROUND模式输出:−2-2。
- CAST_TRUNC模式输出:−1-1。
half → float
将源值以float格式存入目的操作数中,无精度损失。
示例:输入:1.5−2−101.5 - 2^-10,输出:1.5−2−101.5 - 2^-10。
bfloat16_t → fp4x2_e2m1_t
将源值按照精度舍入模式取整,以fp4x2_e2m1_t格式存入目的操作数中。
示例:输入:2.5。
- CAST_RINT模式输出:2。
- CAST_FLOOR模式输出:2。
- CAST_CEIL模式输出:3。
- CAST_ROUND模式输出:3。
- CAST_TRUNC模式输出:2。
bfloat16_t → fp4x2_e1m2_t
将源值按照精度舍入模式取整,以fp4x2_e1m2_t格式存入目的操作数中。
示例:输入:2.5。
- CAST_RINT模式输出:2。
- CAST_FLOOR模式输出:2。
- CAST_CEIL模式输出:3。
- CAST_ROUND模式输出:3。
- CAST_TRUNC模式输出:2。
bfloat16_t → half
将源值按照精度舍入模式取整,以half格式存入目的操作数中。
示例:输入:2.90573e−062.90573e-06。
- CAST_RINT模式输出:2.9e−062.9e-06。
- CAST_FLOOR模式输出:2.861e−062.861e-06。
- CAST_CEIL模式输出:2.9e−062.9e-06。
- CAST_ROUND模式输出:2.9e−062.9e-06。
- CAST_TRUNC模式输出:2.861e−062.861e-06。
bfloat16_t → int32_t
将源值按照精度舍入模式取整,以int32_t格式存入目的操作数中。
示例:输入:26+0.52^{6} + 0.5。
- CAST_RINT模式输出:262^{6}。
- CAST_FLOOR模式输出:262^{6}。
- CAST_CEIL模式输出:26+12^{6} + 1。
- CAST_ROUND模式输出:26+12^{6} + 1。
- CAST_TRUNC模式输出:262^{6}。
bfloat16_t → float
将源值以float格式存入目的操作数中,无精度损失。
示例:输入:1.5−2−61.5 - 2^{-6},输出:1.5−2−61.5 - 2^{-6}。
int32_t → uint8_t
将源值以uint8_t格式存入目的操作数中,高位截断,存在精度损失。负数输入会被视为异常。
示例:输入:231−12^{31} - 1,输出:28−12^8 - 1。
int32_t → uint16_t
将源值以uint16_t格式存入目的操作数中,高位截断,存在精度损失。负数输入会被视为异常。
示例:输入:231−12^{31} - 1,输出:216−12^{16} - 1。
int32_t → int16_t
将源值以int16_t格式存入目的操作数中。
示例:输入:231−12^{31} - 1,输出:215−12^{15} - 1。
int32_t → half
当前数据类型组合仅支持配合SetDeqScale接口使用进行数据量化并完成精度转换,精度舍入模式不生效。
输出:src/217×scale×217src / 2^{17} \times scale \times 2^{17}。
int32_t → float
将源值按照精度舍入模式取到float所能表示的数,以float格式存入目的操作数中。
示例:输入:225+32^{25} + 3,写成float的表示形式:225×(1+2−24+2−25)2^{25} \times (1 + 2^{-24} + 2^{-25}),要求Ev=25+127=152E_v = 25 + 127 = 152,Mv=2−24+2−25M_v = 2^{-24} + 2^{-25}。
图3 int32_t转float

由于float只有23bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数
00000000000000000000001,Ev=152E_v = 152,Mv=2−23M_v = 2^{-23},最终结果为225+42^{25} + 4。 - CAST_FLOOR模式舍入得尾数
00000000000000000000000,Ev=152E_v = 152,Mv=0M_v = 0,最终结果为2252^{25}。 - CAST_CEIL模式舍入得尾数
00000000000000000000001,Ev=152E_v = 152,Mv=2−23M_v = 2^{-23},最终结果为225+42^{25} + 4。 - CAST_ROUND模式舍入得尾数
00000000000000000000001,Ev=152E_v = 152,Mv=2−23M_v = 2^{-23},最终结果为225+42^{25} + 4。 - CAST_TRUNC模式舍入得尾数
00000000000000000000000,Ev=152E_v = 152,Mv=0M_v = 0,最终结果为2252^{25}。
int32_t → int64_t
将源值以int64_t格式存入目的操作数中,无精度损失。
示例:输入:231−12^{31} - 1,输出:231−12^{31} - 1。
uint32_t → uint8_t
将源值以uint8_t格式存入目的操作数中。
示例:输入:232−12^{32} - 1,输出:28−12^8 - 1。
uint32_t → uint16_t
将源值以uint16_t格式存入目的操作数中。
示例:输入:232−12^{32} - 1,输出:216−12^{16} - 1。
uint32_t → int16_t
将源值以int16_t格式存入目的操作数中。
示例:输入:232−12^{32} - 1,输出:215−12^{15} - 1。
float → hifloat8_t
将源值按照精度舍入模式取整,以hifloat8_t格式存入目的操作数中。
示例:输入:1.751.75。
- CAST_ROUND模式输出:22。
- CAST_HYBRID模式,参考float to hifloat8_t类型转换规则的输出。
float → fp8_e4m3fn_t
将源值按照精度舍入模式取整,以fp8_e4m3fn_t格式存入目的操作数中。
示例:输入:2.52.5,CAST_RINT模式输出:22。
float → fp8_e5m2_t
将源值按照精度舍入模式取整,以fp8_e5m2_t格式存入目的操作数中。
示例:输入:2.52.5,CAST_RINT模式输出:22。
float → int16_t
将源值按照精度舍入模式取整,以int16_t格式存入目的操作数中。
示例:输入:222+0.52^{22} + 0.5。
- CAST_RINT模式输出:215−12^{15} - 1(溢出处理)。
- CAST_FLOOR模式输出:215−12^{15} - 1(溢出处理)。
- CAST_CEIL模式输出:215−12^{15} - 1(溢出处理)。
- CAST_ROUND模式输出:215−12^{15} - 1(溢出处理)。
- CAST_TRUNC模式输出:215−12^{15} - 1(溢出处理)。
float → half
将源值按照精度舍入模式取到half所能表示的数,以half格式存入目的操作数中。
示例:输入:0.5+2−120.5 + 2^{-12},写成float的表示形式:2−1×(1+2−11)2^{-1} \times (1 + 2^{-11}),因此Ev=−1+127=126E_v = -1 + 127 = 126,Mv=2−11M_v = 2^{-11}。
图4 float转half

half的指数位可以表示出2−12^{-1},Ev=−1+15=14E_v = -1 + 15 = 14,但half只有10bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数
0000000000,Ev=14E_v = 14,Mv=0M_v = 0,最终结果为0.50.5。 - CAST_FLOOR模式舍入得尾数
0000000000,Ev=14E_v = 14,Mv=0M_v = 0,最终结果为0.50.5。 - CAST_CEIL模式舍入得尾数
0000000001,Ev=14E_v = 14,Mv=2−10M_v = 2^{-10},最终结果为0.5+2−110.5 + 2^{-11}。 - CAST_ROUND模式舍入得尾数
0000000001,Ev=14E_v = 14,Mv=2−10M_v = 2^{-10},最终结果为0.5+2−110.5 + 2^{-11}。 - CAST_TRUNC模式舍入得尾数
0000000000,Ev=14E_v = 14,Mv=0M_v = 0,最终结果为0.50.5。 - CAST_ODD模式舍入得尾数
0000000001,Ev=14E_v = 14,Mv=2−10M_v = 2^{-10},最终结果为0.5+2−110.5 + 2^{-11}。
float → bfloat16_t
将源值按照精度舍入模式取到bfloat16_t所能表示的数,以bfloat16_t格式存入目的操作数中。
示例:输入:0.5+2−9+2−110.5 + 2^{-9} + 2^{-11},写成float的表示形式:2−1×(1+2−8+2−10)2^{-1} \times (1 + 2^{-8} + 2^{-10}),因此Ev=−1+127=126E_v = -1 + 127 = 126,Mv=2−8+2−10M_v = 2^{-8} + 2^{-10}。
图5 float转bfloat16_t

bfloat16_t的指数位位数和float相同,有Ev=126E_v = 126,但bfloat16_t只有7bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数
0000001,Ev=126E_v = 126,Mv=2−7M_v = 2^{-7},最终结果为0.5+2−80.5 + 2^{-8}。 - CAST_FLOOR模式舍入得尾数
0000000,Ev=126E_v = 126,Mv=0M_v = 0,最终结果为0.50.5。 - CAST_CEIL模式舍入得尾数
0000001,Ev=126E_v = 126,Mv=2−7M_v = 2^{-7},最终结果为0.5+2−80.5 + 2^{-8}。 - CAST_ROUND模式舍入得尾数
0000001,Ev=126E_v = 126,Mv=2−7M_v = 2^{-7},最终结果为0.5+2−80.5 + 2^{-8}。 - CAST_TRUNC模式舍入得尾数
0000000,Ev=126E_v = 126,Mv=0M_v = 0,最终结果为0.50.5。
float → int32_t
将源值按照精度舍入模式取整,以int32_t格式存入目的操作数中。
示例:输入:222+0.52^{22} + 0.5。
- CAST_RINT模式输出:2222^{22}。
- CAST_FLOOR模式输出:2222^{22}。
- CAST_CEIL模式输出:222+12^{22} + 1。
- CAST_ROUND模式输出:222+12^{22} + 1。
- CAST_TRUNC模式输出:2222^{22}。
float → float
将源值按照精度舍入模式取整,仍以float格式存入目的操作数中。
示例:输入:0.50.5。
- CAST_RINT模式输出:0.00.0。
- CAST_FLOOR模式输出:0.00.0。
- CAST_CEIL模式输出:1.01.0。
- CAST_ROUND模式输出:1.01.0。
- CAST_TRUNC模式输出:0.00.0。
float → int64_t
将源值按照精度舍入模式取整,以int64_t格式存入目的操作数中。
示例:输入:222+0.52^{22} + 0.5。
- CAST_RINT模式输出:2222^{22}。
- CAST_FLOOR模式输出:2222^{22}。
- CAST_CEIL模式输出:222+12^{22} + 1。
- CAST_ROUND模式输出:222+12^{22} + 1。
- CAST_TRUNC模式输出:2222^{22}。
complex32 → complex64
complex64实部和虚部都是float类型,complex32实部和虚部都是half类型,参考从half到float的精度转换规则。
int64_t → int32_t
将源值以int32_t格式存入目的操作数中。
示例:输入:2312^{31},输出:231−12^{31} - 1。
int64_t → float
将源值按照精度舍入模式取到float所能表示的数,以float格式存入目的操作数中。
示例:输入:235+212+2112^{35} + 2^{12} + 2^{11},写成float的表示形式:235×(1+2−23+2−24)2^{35} \times (1 + 2^{-23} + 2^{-24}),要求Ev=35+127=162E_v = 35 + 127 = 162,Mv=2−23+2−24M_v = 2^{-23} + 2^{-24}。
图6 int64_t转float

由于float只有23bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数
00000000000000000000010,Ev=162E_v = 162,Mv=2−22M_v = 2^{-22},最终结果为235+2132^{35} + 2^{13}。 - CAST_FLOOR模式舍入得尾数
00000000000000000000001,Ev=162E_v = 162,Mv=2−23M_v = 2^{-23},最终结果为235+2122^{35} + 2^{12}。 - CAST_CEIL模式舍入得尾数
00000000000000000000010,Ev=162E_v = 162,Mv=2−22M_v = 2^{-22},最终结果为235+2132^{35} + 2^{13}。 - CAST_ROUND模式舍入得尾数
00000000000000000000010,Ev=162E_v = 162,Mv=2−22M_v = 2^{-22},最终结果为235+2132^{35} + 2^{13}。 - CAST_TRUNC模式舍入得尾数
00000000000000000000001,Ev=162E_v = 162,Mv=2−23M_v = 2^{-23},最终结果为235+2122^{35} + 2^{12}。
int64_t → double
将源值按照精度舍入模式取到double所能表示的数,以double格式存入目的操作数中。
示例:输入:261+29+282^{61} + 2^9 + 2^8,写成double的表示形式:261×(1+2−52+2−53)2^{61} \times (1 + 2^{-52} + 2^{-53}),要求Ev=61+1023=1084E_v = 61 + 1023 = 1084,Mv=2−52+2−53M_v = 2^{-52} + 2^{-53}。
图7 int64_t转double示意图

由于double只有52bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数
...010,Ev=1084E_v = 1084,Mv=2−51M_v = 2^{-51},最终表示的结果为261+2102^{61} + 2^{10}。 - CAST_FLOOR模式舍入得尾数
...001,Ev=1084E_v = 1084,Mv=2−52M_v = 2^{-52},最终表示的结果为261+292^{61} + 2^9。 - CAST_CEIL模式舍入得尾数
...010,Ev=1084E_v = 1084,Mv=2−51M_v = 2^{-51},最终表示的结果为261+2102^{61} + 2^{10}。 - CAST_ROUND模式舍入得尾数
...010,Ev=1084E_v = 1084,Mv=2−51M_v = 2^{-51},最终表示的结果为261+2102^{61} + 2^{10}。 - CAST_TRUNC模式舍入得尾数
...001,Ev=1084E_v = 1084,Mv=2−52M_v = 2^{-52},最终表示的结果为261+292^{61} + 2^9。
double → float
将源值按照精度舍入模式取到float所能表示的数,以float格式存入目的操作数中。
示例:输入:235+212+2112^{35} + 2^{12} + 2^{11},写成float的表示形式:235×(1+2−23+2−24)2^{35} \times (1 + 2^{-23} + 2^{-24}),要求Ev=1058−1023+127=162E_v = 1058 - 1023 + 127 = 162,Mv=2−23+2−24M_v = 2^{-23} + 2^{-24}。
图8 double转float示意图

由于float只有8bit指数,指数部分需要转换,只有23bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数00000000000000000000010,Ev=162E_v = 162,Mv=2−22M_v = 2^{-22},最终表示的结果为235+2132^{35} + 2^{13}。
- CAST_FLOOR模式舍入得尾数00000000000000000000001,Ev=162E_v = 162,Mv=2−23M_v = 2^{-23},最终表示的结果为235+2122^{35} + 2^{12}。
- CAST_CEIL模式舍入得尾数00000000000000000000010,Ev=162E_v = 162,Mv=2−22M_v = 2^{-22},最终表示的结果为235+2132^{35} + 2^{13}。
- CAST_ROUND模式舍入得尾数00000000000000000000010,Ev=162E_v = 162,Mv=2−22M_v = 2^{-22},最终表示的结果为235+2132^{35} + 2^{13}。
- CAST_TRUNC模式舍入得尾数00000000000000000000001,Ev=162E_v = 162,Mv=2−23M_v = 2^{-23},最终表示的结果为235+2122^{35} + 2^{12}。
double → bfloat16_t
将源值按照精度舍入模式取到bfloat16_t所能表示的数,以bfloat16_t格式存入目的操作数中。
示例:输入:235+228+2272^{35} + 2^{28} + 2^{27},写成bfloat16_t的表示形式:235×(1+2−7+2−8)2^{35} \times (1 + 2^{-7} + 2^{-8}),要求Ev=1058−1023+127=162E_v = 1058 - 1023 + 127 = 162,Mv=2−7+2−8M_v = 2^{-7} + 2^{-8}。
图9 double转bfloat16_t示意图

由于bfloat16_t只有8bit指数,指数部分需要转换,只有7bit尾数,因此灰色部分要进行舍入:
- CAST_RINT模式舍入得尾数0000010,Ev=162E_v = 162,Mv=2−6M_v = 2^{-6},最终表示的结果为235+2292^{35} + 2^{29}。
- CAST_FLOOR模式舍入得尾数0000001,Ev=162E_v = 162,Mv=2−7M_v = 2^{-7},最终表示的结果为235+2282^{35} + 2^{28}。
- CAST_CEIL模式舍入得尾数0000010,Ev=162E_v = 162,Mv=2−6M_v = 2^{-6},最终表示的结果为235+2292^{35} + 2^{29}。
- CAST_ROUND模式舍入得尾数0000010,Ev=162E_v = 162,Mv=2−6M_v = 2^{-6},最终表示的结果为235+2292^{35} + 2^{29}。
- CAST_TRUNC模式舍入得尾数0000001,Ev=162E_v = 162,Mv=2−7M_v = 2^{-7},最终表示的结果为235+2282^{35} + 2^{28}。
double → int32_t
将源值按照精度舍入模式取整,以int32_t格式存入目的操作数中。
示例:输入:-1.5,CAST_TRUNC模式输出:-1。
double → int64_t
将源值按照精度舍入模式取整,以int64_t格式存入目的操作数中。
示例:输入:-1.5,CAST_TRUNC模式输出:-1。
complex64 → complex64
complex64实部和虚部都是float类型,参考float与float之间的精度转换规则。
complex64 → complex32
complex64实部和虚部都是float类型,complex32实部和虚部都是half类型,参考从float到half的精度转换规则。