C语言中EDOM与ERANGE的区别及触发操作技术问询
区分
EDOM和ERANGE的错误场景 核心区别
EDOM:定义域错误——输入参数完全不在函数的合法处理范围内,函数无法执行有效计算。ERANGE:范围错误——输入参数在函数定义域内,但计算结果超出当前数据类型的可表示范围,或结果是无穷/NaN这类无效数值。
触发EDOM的常见操作
- 数学函数接收完全超出定义域的参数:
- 调用
acos(1.1):acos的合法输入是[-1, 1],1.1不在此区间内 - 调用
sqrt(-3):平方根函数仅能处理非负数,负数输入直接触发错误 - 调用
log(-1.5):对数函数的定义域是正数,负数输入不被允许
- 调用
触发ERANGE的常见操作
- 计算结果超出数据类型的取值上限:
- 调用
exp(1000):指数函数结果过大,超出double类型的最大值范围
- 调用
- 结果趋近于无穷或极点:
- 调用
log(0.0):对数函数在0处的极限是负无穷,属于超出有效数值范围 - 调用
tan(M_PI/2):正切函数在π/2处趋近于正无穷,触发错误
- 调用
- 数值下溢(结果过小无法被当前类型表示):
- 计算极小的数值,小到低于
double类型能表示的最小正数值时,也会触发ERANGE
- 计算极小的数值,小到低于
对应你的示例代码
acos(+1.1)的输入超出acos的合法定义域,因此errno被设为EDOM;log(0.0)的输入在对数函数的定义域边界,但计算结果是负无穷,超出有效数值范围,因此errno被设为ERANGE。
内容的提问来源于stack exchange,提问作者Tong Zhao
相关产品推荐
相关产品推荐

