舍入模式与饱和模式【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit概述在进行数据类型转换时Ascend C API支持多种舍入模式和饱和模式。这些模式决定了当源数据类型转换为不同精度或范围的目标数据类型时如何处理数值的舍入和溢出问题。舍入模式主要用于浮点数之间的转换或浮点数转整数时确定如何将高精度数值舍入到低精度表示。饱和模式/非饱和模式处理数值超出目标数据类型表示范围时的溢出行为。舍入模式说明Ascend C API支持以下舍入模式舍入模式函数后缀说明示例RINT_rn四舍六入五成双舍入Bankers Rounding。当小数部分为0.5时舍入到最近的偶数。1.5 → 2, 2.5 → 2, 3.5 → 4ROUND_rna四舍五入舍入。小数部分≥0.5时向上舍入0.5时向下舍入。1.4 → 1, 1.5 → 2, 1.6 → 2FLOOR_rd向负无穷方向舍入。总是向下取整。1.7 → 1, -1.3 → -2CEIL_ru向正无穷方向舍入。总是向上取整。1.3 → 2, -1.7 → -1TRUNC_rz向零方向舍入。直接截断小数部分。1.7 → 1, -1.7 → -1ODD_ro最近邻奇数舍入。舍入到最近的奇数。1.5 → 1, 2.5 → 3, 3.5 → 3HYBRID_rh混合舍入模式。特指输出结果为hifloat8_t数据时使用的一种随机舍入模式。-舍入模式详细说明RINT四舍六入五成双也称为银行家舍入法是一种统计学上最无偏的舍入方法。当小数部分小于0.5时向下舍入当小数部分大于0.5时向上舍入当小数部分等于0.5时舍入到最近的偶数示例1.4 → 1 (小数部分 0.5向下) 1.5 → 2 (小数部分 0.5舍入到偶数) 2.5 → 2 (小数部分 0.5舍入到偶数) 3.5 → 4 (小数部分 0.5舍入到偶数) -1.5 → -2 (小数部分 0.5舍入到偶数)ROUND四舍五入最常用的舍入方法符合日常习惯。当小数部分小于0.5时向下舍入当小数部分大于等于0.5时向上舍入示例1.4 → 1 (小数部分 0.5) 1.5 → 2 (小数部分 ≥ 0.5) 1.6 → 2 (小数部分 ≥ 0.5) -1.5 → -2 (向绝对值更大的方向舍入)FLOOR向下取整始终向负无穷方向舍入即使结果变小。示例1.7 → 1 (向下) -1.3 → -2 (向负无穷方向变得更小)CEIL向上取整始终向正无穷方向舍入即使结果变大。示例1.3 → 2 (向上) -1.7 → -1 (向正无穷方向变得更大)TRUNC向零截断直接截断小数部分向零方向舍入。示例1.7 → 1 (向零方向) -1.7 → -1 (向零方向)ODD奇数舍入舍入到最近的奇数主要用于某些特殊的数值计算场景。示例1.5 → 1 (最近的奇数) 2.5 → 3 (最近的奇数) 3.5 → 3 (最近的奇数)饱和模式与非饱和模式说明当数据类型转换时源数据的值可能超出目标数据类型的表示范围此时需要通过饱和模式或非饱和模式来处理溢出。非饱和模式Non-Saturation Mode在非饱和模式下当数据超出目标类型范围时整型转换结果被截断保留最低有效位LSB高位直接丢弃二进制截断示例将int32转换为int8时只保留低8位二进制截断示例int32 → int8输入值int32: 0x000001FF (511) 二进制表示: 0000 0000 0000 0000 0000 0001 1111 1111 截断后int8: 1111 1111 (0xFF, -1) 说明只保留低8位高位丢弃 输入值int32: 0x00000100 (256) 二进制表示: 0000 0000 0000 0000 0000 0001 0000 0000 截断后int8: 0000 0000 (0x00, 0) 说明只保留低8位高位丢弃 输入值int32: 0xFFFFFF00 (-256) 二进制表示: 1111 1111 1111 1111 1111 1111 0000 0000 截断后int8: 0000 0000 (0x00, 0) 说明只保留低8位高位丢弃浮点数转换超出范围返回输出类型的对应符号inf值正/负无穷±inf输入返回±infNaN输入返回NaN示例float → half输入值: 70000.0 (超出half范围) 输出值: inf 输入值: -70000.0 输出值: -inf 输入值: NaN 输出值: NaN浮点转整型超出范围结果被截断至目标格式的数据宽度±inf输入返回输出类型的最值NaN输入返回0示例float → int16输入值: 100000.5 (超出int16范围) 非饱和模式: 结果被截断具体值取决于二进制表示 输入值: inf 输出值: 32767 (int16最大值) 输入值: NaN 输出值: 0饱和模式Saturation Mode在饱和模式下当数据超出目标类型范围时结果被限制在目标类型的可表示范围内整型转换超出范围返回目标类型的最大值或最小值保持数值安全不会出现因截断导致的意外结果示例int32 → int8输入值: 511 (超出int8范围) 饱和输出: 127 (int8最大值) 输入值: -300 (超出int8范围) 饱和输出: -128 (int8最小值) 输入值: 100 (在int8范围内) 饱和输出: 100 (保持不变)示例int32 → uint8输入值: 500 (超出uint8范围) 饱和输出: 255 (uint8最大值) 输入值: -10 (超出uint8范围) 饱和输出: 0 (uint8最小值) 输入值: 100 (在uint8范围内) 饱和输出: 100 (保持不变)浮点数转换超出范围返回输出类型的对应最值±inf输入返回输出类型的对应最值NaN输入返回0示例float → half输入值: 70000.0 (超出half范围) 饱和输出: 65504.0 (half最大值) 输入值: -70000.0 饱和输出: -65504.0 (half最小值) 输入值: inf 饱和输出: 65504.0 (half最大值) 输入值: NaN 饱和输出: 0浮点转整型超出范围返回输出类型的对应最值±inf输入返回输出类型的对应最值NaN输入返回0示例float → int16输入值: 100000.5 (超出int16范围) 饱和输出: 32767 (int16最大值) 输入值: -50000.0 饱和输出: -32768 (int16最小值) 输入值: inf 饱和输出: 32767 输入值: NaN 饱和输出: 0模式对比总结场景非饱和模式饱和模式整型转整型溢出截断低位高位丢弃返回目标类型最值浮点转浮点超出范围返回±inf返回目标类型最值浮点转整型超出范围截断至目标宽度返回目标类型最值浮点转整型±inf返回目标类型最值返回目标类型最值浮点转浮点±inf返回±inf返回目标类型最值NaN输入返回NaN或0返回0配置方法开启饱和模式和非饱和模式时需配置ctrl寄存器。ctrl寄存器的详细说明请参见asc_set_ctrl接口。【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考