带可去奇点的函数浮点实现:潜在异常值排查问询
函数实现的漏洞值分析
给定的整函数定义:
- 当
x>0时,ƒ(x) = sin(sqrt(x)) / sqrt(x) - 当
x=0时,ƒ(x) = 1 - 当
x<0时,ƒ(x) = sinh(sqrt(-x)) / sqrt(-x)
当前类C实现存在以下会导致运行异常或结果错误的输入值:
1. 无穷大输入(+∞/-∞)
- 输入
x=+∞:q = sqrt(fabs(+∞)) = +∞,sin(+∞)的结果为NaN,最终计算sin(q)/q得到NaN/∞ = NaN。但原函数当x→+∞时,sin(sqrt(x))始终在[-1,1]区间,除以趋近+∞的sqrt(x)后极限应为0,此处返回NaN属于结果错误。 - 输入
x=-∞:q = sqrt(fabs(-∞)) = +∞,sinh(+∞) = +∞,计算sinh(q)/q得到∞/∞ = NaN。但原函数当x→-∞时,sinh(sqrt(-x)) ≈ e^{sqrt(-x)}/2,除以sqrt(-x)后趋近+∞,此处返回NaN属于结果错误。
2. NaN输入
当x为NaN时,x*x == 0的判断结果为false,后续x>0的判断也为false,最终进入sinh(q)/q分支。由于sqrt(fabs(NaN)) = NaN,sinh(NaN) = NaN,最终结果为NaN/NaN = NaN。虽然数学上函数在NaN处应返回NaN,但部分浮点环境下可能因NaN的传播触发未定义行为,且实现未显式兼容NaN输入,属于潜在风险点。
3. 极小非正规数(Subnormal Numbers)
对于极小的非零正/负非正规数,x*x会下溢到0,触发return 1 - x/6分支。虽然该分支结果是函数泰勒展开的前两项近似,精度尚可,但严格来说此时x≠0却进入了x=0的处理分支,属于逻辑不一致。不过该情况不会导致运行崩溃,仅存在精度和逻辑瑕疵。
内容的提问来源于stack exchange,提问作者emacs drives me nuts
相关产品推荐
相关产品推荐

