将除以零定义为无穷大

时间:2019-06-18 08:13:35

标签: c

我想将除以零的结果定义为double INF。

对于C / C ++中的默认行为(除以零)有一些讨论。我读过的任何问题都没有明确地询问如何定义零除以在C语言中变为无穷大。这是否有意义,我宁愿不讨论。我只想用一个包含多个C函数的文件来定义它,并需要它的语法。

2 个答案:

答案 0 :(得分:13)

如果您需要此行为,请使用浮点数,该数字可以表示无穷大并提供所需的行为。请注意,从技术上讲,这是未定义的行为,但实际上,大多数编译器(用于标准体系结构的所有主流编译器)都实现IEEE 754语义,例如GCC

int main() {
    float f = 42;
    float g = f / 0.0f;
    printf("%f\n", g);
}

输出:

inf

这是 可以依靠的行为,因为编译器已明确记录了该行为。但是,在编写可移植代码时,请确保您在代码内部测试了这些假设(例如,通过测试是否定义了预处理器宏__STDC_IEC_559__as well as compiler-specific macros)。

如果出于某种原因,您需要对整数值使用此行为,那么唯一的办法就是创建自己的类型。像这样:

typedef struct {
    int value;
    bool is_inf;
    bool is_nan;
} ext_int;

ext_int make_ext_int(int i) {
    return (ext_int) {i, false, false};
}

ext_int make_nan() {
    return (ext_int) {0, false, true};
}

ext_int make_inf(int sign) {
    return (ext_int) {(sign > 0) - (sign < 0), true, false};
}

ext_int ext_div(ext_int a, ext_int b) {
    if (a.is_nan || b.is_nan) {
        return  make_nan();
    }
    if (b.value == 0) {
        return make_inf(a.value);
    }
    // TODO: insert other cases.
    return (ext_int) {a.value / b.value, false, false};
}

…在实际的实现中,您将打包不同的标志,而不是为每个标志单独设置bool

答案 1 :(得分:8)

浮点除以零在C标准中没有定义。

(IEEE754-通用但绝非普遍存在-如果a / 0.0为正,+INF为负,a-INF,{ {1}}(如果a也为零)。

您最好的选择是定义一个对除法运算符建模的函数,并在其中实现您的行为。