精度转换

二进制精度舍入规则

在了解不同类型之间的精度转换规则之前,需先了解二进制的精度舍入规则。

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

图1 二进制精度舍入规则示意图

二进制精度舍入规则示意图

各精度舍入模式对待舍入部分的判断规则如下表所示:

表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 = 27Mv=2−11M_v = 2^{-11}

图2 int16_t转half

int16_t转half

由于half只有10bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式输入得尾数0000000000Ev=27E_v = 27Mv=0M_v = 0,最终结果为:2122^{12}
  • CAST_FLOOR模式输入得尾数0000000000Ev=27E_v = 27Mv=0M_v = 0,最终结果为:2122^{12}
  • CAST_CEIL模式舍入得尾数0000000001Ev=27E_v = 27Mv=2−10M_v = 2^{-10},最终结果为:212+42^{12} + 4
  • CAST_ROUND模式舍入得尾数0000000001Ev=27E_v = 27Mv=2−10M_v = 2^{-10},最终结果为:212+42^{12} + 4
  • CAST_TRUNC模式舍入得尾数0000000000Ev=27E_v = 27Mv=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


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 = 152Mv=2−24+2−25M_v = 2^{-24} + 2^{-25}

图3 int32_t转float

int32_t转float

由于float只有23bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数00000000000000000000001Ev=152E_v = 152Mv=2−23M_v = 2^{-23},最终结果为225+42^{25} + 4
  • CAST_FLOOR模式舍入得尾数00000000000000000000000Ev=152E_v = 152Mv=0M_v = 0,最终结果为2252^{25}
  • CAST_CEIL模式舍入得尾数00000000000000000000001Ev=152E_v = 152Mv=2−23M_v = 2^{-23},最终结果为225+42^{25} + 4
  • CAST_ROUND模式舍入得尾数00000000000000000000001Ev=152E_v = 152Mv=2−23M_v = 2^{-23},最终结果为225+42^{25} + 4
  • CAST_TRUNC模式舍入得尾数00000000000000000000000Ev=152E_v = 152Mv=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


float → fp8_e4m3fn_t

将源值按照精度舍入模式取整,以fp8_e4m3fn_t格式存入目的操作数中。

示例:输入:2.52.5CAST_RINT模式输出:22


float → fp8_e5m2_t

将源值按照精度舍入模式取整,以fp8_e5m2_t格式存入目的操作数中。

示例:输入:2.52.5CAST_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 = 126Mv=2−11M_v = 2^{-11}

图4 float转half

float转half

half的指数位可以表示出2−12^{-1}Ev=−1+15=14E_v = -1 + 15 = 14,但half只有10bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数0000000000Ev=14E_v = 14Mv=0M_v = 0,最终结果为0.50.5
  • CAST_FLOOR模式舍入得尾数0000000000Ev=14E_v = 14Mv=0M_v = 0,最终结果为0.50.5
  • CAST_CEIL模式舍入得尾数0000000001Ev=14E_v = 14Mv=2−10M_v = 2^{-10},最终结果为0.5+2−110.5 + 2^{-11}
  • CAST_ROUND模式舍入得尾数0000000001Ev=14E_v = 14Mv=2−10M_v = 2^{-10},最终结果为0.5+2−110.5 + 2^{-11}
  • CAST_TRUNC模式舍入得尾数0000000000Ev=14E_v = 14Mv=0M_v = 0,最终结果为0.50.5
  • CAST_ODD模式舍入得尾数0000000001Ev=14E_v = 14Mv=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 = 126Mv=2−8+2−10M_v = 2^{-8} + 2^{-10}

图5 float转bfloat16_t

float转bfloat16_t

bfloat16_t的指数位位数和float相同,有Ev=126E_v = 126,但bfloat16_t只有7bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数0000001Ev=126E_v = 126Mv=2−7M_v = 2^{-7},最终结果为0.5+2−80.5 + 2^{-8}
  • CAST_FLOOR模式舍入得尾数0000000Ev=126E_v = 126Mv=0M_v = 0,最终结果为0.50.5
  • CAST_CEIL模式舍入得尾数0000001Ev=126E_v = 126Mv=2−7M_v = 2^{-7},最终结果为0.5+2−80.5 + 2^{-8}
  • CAST_ROUND模式舍入得尾数0000001Ev=126E_v = 126Mv=2−7M_v = 2^{-7},最终结果为0.5+2−80.5 + 2^{-8}
  • CAST_TRUNC模式舍入得尾数0000000Ev=126E_v = 126Mv=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 = 162Mv=2−23+2−24M_v = 2^{-23} + 2^{-24}

图6 int64_t转float

int64_t转float

由于float只有23bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数00000000000000000000010Ev=162E_v = 162Mv=2−22M_v = 2^{-22},最终结果为235+2132^{35} + 2^{13}
  • CAST_FLOOR模式舍入得尾数00000000000000000000001Ev=162E_v = 162Mv=2−23M_v = 2^{-23},最终结果为235+2122^{35} + 2^{12}
  • CAST_CEIL模式舍入得尾数00000000000000000000010Ev=162E_v = 162Mv=2−22M_v = 2^{-22},最终结果为235+2132^{35} + 2^{13}
  • CAST_ROUND模式舍入得尾数00000000000000000000010Ev=162E_v = 162Mv=2−22M_v = 2^{-22},最终结果为235+2132^{35} + 2^{13}
  • CAST_TRUNC模式舍入得尾数00000000000000000000001Ev=162E_v = 162Mv=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 = 1084Mv=2−52+2−53M_v = 2^{-52} + 2^{-53}

图7 int64_t转double示意图

int64_t转double示意图

由于double只有52bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数...010Ev=1084E_v = 1084Mv=2−51M_v = 2^{-51},最终表示的结果为261+2102^{61} + 2^{10}
  • CAST_FLOOR模式舍入得尾数...001Ev=1084E_v = 1084Mv=2−52M_v = 2^{-52},最终表示的结果为261+292^{61} + 2^9
  • CAST_CEIL模式舍入得尾数...010Ev=1084E_v = 1084Mv=2−51M_v = 2^{-51},最终表示的结果为261+2102^{61} + 2^{10}
  • CAST_ROUND模式舍入得尾数...010Ev=1084E_v = 1084Mv=2−51M_v = 2^{-51},最终表示的结果为261+2102^{61} + 2^{10}
  • CAST_TRUNC模式舍入得尾数...001Ev=1084E_v = 1084Mv=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 = 162Mv=2−23+2−24M_v = 2^{-23} + 2^{-24}

图8 double转float示意图

double转float示意图

由于float只有8bit指数,指数部分需要转换,只有23bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数00000000000000000000010,Ev=162E_v = 162Mv=2−22M_v = 2^{-22},最终表示的结果为235+2132^{35} + 2^{13}
  • CAST_FLOOR模式舍入得尾数00000000000000000000001,Ev=162E_v = 162Mv=2−23M_v = 2^{-23},最终表示的结果为235+2122^{35} + 2^{12}
  • CAST_CEIL模式舍入得尾数00000000000000000000010,Ev=162E_v = 162Mv=2−22M_v = 2^{-22},最终表示的结果为235+2132^{35} + 2^{13}
  • CAST_ROUND模式舍入得尾数00000000000000000000010,Ev=162E_v = 162Mv=2−22M_v = 2^{-22},最终表示的结果为235+2132^{35} + 2^{13}
  • CAST_TRUNC模式舍入得尾数00000000000000000000001,Ev=162E_v = 162Mv=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 = 162Mv=2−7+2−8M_v = 2^{-7} + 2^{-8}

图9 double转bfloat16_t示意图

double转bfloat16_t示意图

由于bfloat16_t只有8bit指数,指数部分需要转换,只有7bit尾数,因此灰色部分要进行舍入:

  • CAST_RINT模式舍入得尾数0000010,Ev=162E_v = 162Mv=2−6M_v = 2^{-6},最终表示的结果为235+2292^{35} + 2^{29}
  • CAST_FLOOR模式舍入得尾数0000001,Ev=162E_v = 162Mv=2−7M_v = 2^{-7},最终表示的结果为235+2282^{35} + 2^{28}
  • CAST_CEIL模式舍入得尾数0000010,Ev=162E_v = 162Mv=2−6M_v = 2^{-6},最终表示的结果为235+2292^{35} + 2^{29}
  • CAST_ROUND模式舍入得尾数0000010,Ev=162E_v = 162Mv=2−6M_v = 2^{-6},最终表示的结果为235+2292^{35} + 2^{29}
  • CAST_TRUNC模式舍入得尾数0000001,Ev=162E_v = 162Mv=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的精度转换规则。