AWK运行脚本时exp函数参数超出范围报错,该如何解决?
报错根因
你公式中第一个指数项的分母0.00142118数值极小,当输入文件中$1(第一列数值)≥5时,-$1/0.00142118的计算结果约为-3518,远低于双精度浮点数exp函数的有效输入下限(约-709),运算时会直接下溢为0,因此触发范围警告。
现有结果正确性
你贴出的$1≈5对应的输出结果是准确的:下溢的指数项本身数值已经趋近于0,对最终计算结果没有实际影响。只有当你的输入文件中存在$1<0.01的行时,第一个指数项才会产生可观测的贡献,也不会触发这类警告。
可选修改方案
方案1:直接屏蔽警告(不影响计算结果)
适合你确定输入文件中$1普遍较大、不需要考虑第一个指数项贡献的场景,修改后的脚本如下:
#!/bin/bash # 用gawk关闭警告输出,其余逻辑不变 gawk --no-warning '{$2=((0.231771*exp(-$1/0.00142118)+0.299638*exp(-$1/0.0500264)+0.318124*exp(-$1/0.332495)+0.150467*exp(-$1/1.8087))-$2); print}' lut_ver_eps_900_1100_v5.xvg | tee lut_ver_eps_900_1100_v5_roznice.xvg
如果你的环境没有gawk,也可以直接把标准错误重定向到空设备:
#!/bin/bash awk '{$2=((0.231771*exp(-$1/0.00142118)+0.299638*exp(-$1/0.0500264)+0.318124*exp(-$1/0.332495)+0.150467*exp(-$1/1.8087))-$2); print}' lut_ver_eps_900_1100_v5.xvg 2>/dev/null | tee lut_ver_eps_900_1100_v5_roznice.xvg
方案2:手动添加下溢判断(兼容性更好)
通过逻辑判断主动把极小的指数项替换为0,从根源避免警告触发,适配所有输入范围:
#!/bin/bash awk ' { term1 = -$1/0.00142118 < -709 ? 0 : 0.231771*exp(-$1/0.00142118) $2 = (term1 + 0.299638*exp(-$1/0.0500264) + 0.318124*exp(-$1/0.332495) + 0.150467*exp(-$1/1.8087)) - $2 print }' lut_ver_eps_900_1100_v5.xvg | tee lut_ver_eps_900_1100_v5_roznice.xvg
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

