繁体   English   中英

将除以零除以无穷大

[英]Define division by zero as infinity

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

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

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

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

输出:

inf

这是可以依赖的行为,因为编译器清楚地记录了这些行为。 但是,在编写可移植代码时,请确保在代码中测试这些假设(例如,通过测试是否定义了预处理器宏__STDC_IEC_559__ 以及特定编译器的宏 )。

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

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

浮点除以零是C标准未定义的。

(IEEE754 - 常见,但绝不是普遍存在 - 如果a为正,则将a / 0.0定义为+INF如果a为负则定义a / 0.0 -INF如果a为0则定义a NaN )。

最好的办法是定义一个模拟除法运算符的函数,并在那里实现您的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM