已合并
fix(asinh): improve large-value precision #4822
fix(asinh): improve large-value precision #4822
已合并
m0_73979701创建于 8月18日
m0_73979701
m0_73979701
8月18日

描述

修复 Asinh 在中大数值区间的精度问题。

原有实现对所有非小值统一使用 log(u) * r / (u - 1) 补偿;该补偿在中大数值区间会额外引入约 1~2 ULP 误差。本次改动按输入绝对值进行分段处理:

  • |x| < 10:保留原有 log1p 补偿路径,保证小值精度;
  • 10 <= |x| < 2^28:直接保留 log(u),避免额外乘除带来的精度损失;
  • |x| >= 2^28:使用 log(|x|) + ln(2) + 1 / |x|^2 渐近式,避免 u ≈ 2|x| 溢出;
  • 保留 NaN 传播语义。

关联的Issue

https://gitcode.com/cann/ops-math/issues/2734

测试

  • 使用 Asinh 对应的 golden 和测试用例完成三方精度测试;
  • 修改后的 Asinh 三方精度测试全部通过;
  • 覆盖 FP32、FP16、BF16 及中值、大值、极大值和 NaN 场景。

文档更新

无文档更新。

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 m0_73979701 的贡献)
m0_73979701m0_73979701
8月18日 创建了 pull request,commit bf2415d2
atomgit-bot
atomgit-bot
8月18日 评论:

变更摘要

本 PR 修复 Asinh 在中大数值区间的精度问题(math/asinh/op_kernel/arch35/asinh.h 中的 ComputeFp32Pipeline 实现)。原实现对所有非小值统一采用 log(u) * r / (u - 1) 补偿,会在中大数值区间额外引入约 1~2 ULP 误差;本次改动按输入绝对值 |x| 分段处理,并新增 CONST_DIRECT_LOG_THRESHOLD = 10.0fCONST_ASYMPTOTIC_THRESHOLD = 268435456.0f(2^28)两个常量作为分段阈值,同时保留 NaN 传播语义。

主要改动

  • 新增分段阈值常量:在 asinh.h 中新增 CONST_DIRECT_LOG_THRESHOLD = 10.0f(中大参数直接使用 log(u))与 CONST_ASYMPTOTIC_THRESHOLD = 268435456.0f(2^28,以上使用渐近式),用于区分三种处理区间。

  • Step 15 中值区间直接保留 log(u):对 10 <= |x| < 2^28,通过 CompareScalar + Select 将分子 r 与分母 b 同时置为 CONST_ONE,使 Mul/Div 退化为恒等操作,直接保留 Step 14 的 log(u),避免额外乘除引入精度损失;|x| < 10 仍走原有 log(u) * r / (u - 1) 补偿路径。

  • Step 16 分段选择 correction|x| < 10 保持原有 min(res, correction)10 <= |x| < 2^28 将 correction 屏蔽为 CONST_S_MAX(取 min 时自然失效);|x| >= 2^28 通过 Select 恢复 log(|x|) + ln(2) + 1/|x|^2 渐近式,避免 u ≈ 2|x| 时溢出;correction 临时借用已结束生命周期的 bBuf 保存。

  • 保留 NaN 传播语义:利用「NaN 与自身比较为 false」的特性,通过 Compare(absX, absX, EQ) + Select 恢复 NaN 对应的 correction 分支,使 NaN 输入仍沿原有 min 路径传播。

likedislike
不准确?
atomgit-bot
atomgit-bot
8月18日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
8月18日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
8月18日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
For more, you also can visit HICANN.


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
math/asinh 周奇龙, andong_hw (2/2) 周奇龙 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

m0_73979701, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
8月18日 将FelixTang7,yue-ma,zhou-qilong,wangrui_,rxtfeng,loov1,zhangzijie,jia0liang,zl_hw,songkai111,chenxingyu18,pingchuantang,llimwang,gubaocheng,andong_hw,xuejinghui,zhanw_coding设为评审人
CANN-robotCANN-robot成员
8月18日 将FelixTang7,yue-ma,zhou-qilong,wangrui_,rxtfeng,loov1,zhangzijie,zl_hw,songkai111,chenxingyu18,pingchuantang,llimwang,gubaocheng,andong_hw,xuejinghui,zhanw_coding设为审查人
m0_73979701
m0_73979701
8月18日 评论:

compile

likedislike
m0_73979701m0_73979701
8月18日 预合并成功(commit_id: 0cd7a06bf36476b664eda42aa1e859585c2c4ece)
m0_73979701
m0_73979701
8月18日 评论:

compile

likedislike
m0_73979701m0_73979701
8月18日 预合并成功(commit_id: 5337467f9ba44fc964ec8a5105889c8be4bb1c12)
CANN-robotCANN-robot成员
8月18日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
8月18日 评论:

流水线任务触发成功
任务链接 [edd67ab073aa40b199c60f7e666489ac][流水线指导]

任务名称状态日志下载链接
pre_comment ✅ SUCCESS >>>>>
Compile_Ascend_X86_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_harmony-infer ✅ SUCCESS >>>>>
Compile_Ascend_ARM_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_experimental_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910b ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_910c ✅ SUCCESS >>>>> >>>>>
Compile_X86_monitor_950 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_A5_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_ARM_A5_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_X86_mobile_station_9030_ubuntu24 ✅ SUCCESS >>>>> >>>>>
Compile_Ascend_single ✅ SUCCESS >>>>> >>>>>
UT_Test ✅ SUCCESS
UT_Test_experimental ✅ SUCCESS
UT_Test_kernel ✅ SUCCESS
PreSmoke_A900 ✅ SUCCESS >>>>>
API_Check ✅ SUCCESS >>>>>
PreSmoke_ATK_Test_A2 ✅ SUCCESS >>>>>

[2026-08-18 16:51:32]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
8月18日 评论:

流水线任务触发成功
任务链接 [1564bd95ee3d4371bf64835c461dc315][流水线指导]

任务名称状态日志下载链接
SCA ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
codecheck_Pr ✅ SUCCESS
StaticCheck_codespell ✅ SUCCESS
StaticCheck_link_validity ✅ SUCCESS
StaticCheck_resource_existence ✅ SUCCESS
StaticCheck_tag_closed ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS
codecheck_precommit ✅ SUCCESS >>>>>

[2026-08-18 16:47:50]    CI执行结束

likedislike
CANN-robotCANN-robot成员
8月18日 添加了label:api-check-pass
CANN-robotCANN-robot成员
8月18日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
8月18日 添加了label:ci-pipeline-passed
m0_73979701m0_73979701
8月19日 修改了pull request 的描述
andong_hw成员
8月19日 评论:

/lgtm

likedislike
sunday成员
8月19日 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
8月19日 添加了label:lgtmapproved
CANN-robotCANN-robot成员
8月19日 关闭了关联的issue
CANN-robotCANN-robot成员
8月19日 合入了pull request