面向中等幅值输入的快速高精度三角模归约算法求询
高精度无表角度归约方案(适配中等范围输入)
针对你遇到的余弦函数在中等输入范围(如-10000至10000)的归约精度问题,尤其是归约后值接近零时的误差,以下是无需预计算表、高效且能保证≤1ulp归约精度的方案:
1. 双精度辅助的单精度归约(首选方案)
该方案利用单精度转双精度无精度损失的特性,通过双精度运算消除归约误差,完全适配SIMD场景:
- 步骤:
- 将单精度输入
x精确转换为双精度xd(单精度转双精度是无损操作)。 - 用高精度双精度常量
TWO_PI = 6.283185307179586476925286766559,计算整数倍k = round(xd / TWO_PI)(双精度可精确表示该范围内的所有整数,无误差)。 - 计算余数
r = xd - k * TWO_PI,此时r的双精度误差≤0.5ulp。 - 将
r转换回单精度,得到最终归约角度。
- 将单精度输入
- 效果:对于|x|≤10000的输入,归约后的角度误差≤0.5ulp单精度,完全解决你提到的接近零值时的4ulps误差问题,保证余弦计算的误差≤1ulp。
2. 单精度补偿式归约(无双精度依赖)
如果受限于硬件无法高效使用双精度SIMD,可采用两步归约+误差补偿的方法:
- 步骤:
- 用单精度近似值
TWO_PI_F = 6.283185307f计算初步余数:k = round(x / TWO_PI_F),r1 = x - k * TWO_PI_F。 - 预计算单精度补偿常量
PI_ERROR_F = (double)TWO_PI - TWO_PI_F(即真实2π与单精度近似值的差值,约为1.42e-8)。 - 计算补偿项
delta = k * PI_ERROR_F,将其转换为单精度后,得到最终余数r = r1 - delta。
- 用单精度近似值
- 效果:该方案通过补偿第一步归约的系统误差,使最终归约角度误差≤0.5ulp单精度,同样满足你的精度要求,且全程无表操作,适配SIMD。
3. 双精度输入的扩展方案
若处理双精度输入,可类比单精度方案:
- 用长双精度(long double)的高精度2π值辅助归约,或采用双精度下的两步补偿归约,确保余数误差≤0.5ulp双精度,从而保证余弦计算的精度。
关键说明
余弦函数在θ≈0时对相位偏移的敏感性远高于正弦(cos(θ)≈1-θ²/2,误差随θ的平方放大;而sin(θ)≈θ,误差线性放大),因此归约精度的微小差异会在余弦结果中被放大。上述方案通过将归约误差控制在0.5ulp以内,可确保余弦计算在[-8π:8π]甚至更大范围内的误差≤1ulp。
内容的提问来源于stack exchange,提问作者graphicsMan
相关产品推荐
相关产品推荐

