在OpenSCAD中如何检测函数返回的inf值?
OpenSCAD中检测inf值的方法
问题背景
我拥有丰富的软件开发经验,但接触OpenSCAD的时间较短。我编写了如下函数:
function GetSlope(angle)=sin(angle)/cos(angle);
当角度为90°或270°时,由于cos值为0导致除以0,该函数会返回inf。我需要在使用此函数时检测该值,但OpenSCAD中未找到is_inf函数或inf常量,请问是否存在检测inf值的方法,还是必须在函数外部手动检测?
解决方案
OpenSCAD确实没有内置的is_inf函数或inf常量,不过有两种更可靠的处理方式:
提前在函数内规避除以0的情况
由于浮点数计算存在精度误差,不要直接判断cos(angle) == 0,而是判断其绝对值是否小于一个极小阈值(比如1e-6),此时直接返回一个可检测的标记值(比如undef):function GetSlope(angle) = abs(cos(angle)) < 1e-6 ? undef : sin(angle)/cos(angle);后续使用时,通过内置的
is_undef()函数判断即可:slope = GetSlope(90); if (is_undef(slope)) { // 处理垂直角度的逻辑 } else { // 使用正常斜率值 }事后检测inf值
如果必须保留原函数逻辑,可利用inf的数值特性——它会远大于常规计算中的合理数值,通过判断值是否超出某个极大阈值来识别:slope = GetSlope(90); if (abs(slope) > 1e20) { // 判定为inf,处理垂直情况 }这种方式不如第一种可靠,因为极端情况下可能有合法数值接近该阈值,但在常规场景下可以使用。
内容的提问来源于stack exchange,提问作者Nathan Sokalski
相关产品推荐
相关产品推荐

