在 AscendC 的 Cast / ScalarCast 等精度转换 API 中,CAST_ROUNDCAST_RINT 的核心差异在于对「恰好处于中间值」(tie)的处理方式不同CAST_RINT 即 IEEE 754 标准中的 RNE(Round to Nearest, ties to Even,四舍六入五成双)


语义对比

RoundMode 中文名 规则 等价标准
CAST_RINT 四舍六入五成双 向最近的偶数舍入;若待舍入位首位为 1 且后续全为 0(恰好在中间),则看保留位的末位:末位为 0 不进位,末位为 1 进位 RNE (Round to Nearest Even)
CAST_ROUND 四舍五入 若待舍入位首位为 0,则不进位;否则(首位为 1)进位 远离零的 Round Half Up

位级判定逻辑(官方定义)

  • CAST_RINT

    • 待舍入部分首位为 0 → 不进位
    • 待舍入部分首位为 1 且后续不全为 0 → 进位
    • 待舍入部分首位为 1 且后续全为 0(tie)→ 保留位末位为 0 不进位,末位为 1 进位
  • CAST_ROUND

    • 待舍入部分首位为 0 → 不进位
    • 待舍入部分首位为 1 → 进位(无论后续位是什么)

数值示例

float → int32_t 转换为例,输入 [1.4, 1.5, 1.6, 2.4, 2.5, 2.6]

输入 CAST_RINT (RNE) CAST_ROUND
1.4 1 1
1.5 2(2 是偶数) 2
1.6 2 2
2.4 2 2
2.5 2(2 是偶数,tie 向偶) 3
2.6 3 3

枚举定义

enum class RoundMode {
    CAST_NONE = 0,   // 有精度损失时同 CAST_RINT,无损失时不舍入
    CAST_RINT,       // RNE,四舍六入五成双
    CAST_FLOOR,      // 向负无穷舍入
    CAST_CEIL,       // 向正无穷舍入
    CAST_ROUND,      // 四舍五入
    CAST_TRUNC,      // 向零舍入
    CAST_ODD,        // 向最近的奇数舍入(Von Neumann rounding)
    CAST_HYBRID      // 随机舍入,特指 hifloat8_t 输出
};

使用建议

  • 追求与 GPU / 主流深度学习框架对齐:优先用 CAST_RINT(RNE),这是 IEEE 754 默认舍入模式,也是 NVIDIA GPU 的默认行为。
  • 需要严格「四舍五入」语义(如某些量化场景要求):使用 CAST_ROUND
  • 注意硬件限制:不同昇腾芯片对同一类型组合支持的 RoundMode 不同。例如 Atlas 训练系列产品对 float → half 仅支持 CAST_ODD / CAST_NONE,而 Atlas A2 / A3 / 950 系列支持更全 。写算子前务必查目标硬件的 Cast 类型支持表。
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐