c - 将被零除定义为无穷大

标签 c

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

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

最佳答案

如果您需要此行为,请使用可以表示无穷大的 float ,并提供所需的行为。请注意,从技术上讲,这是未定义的行为,但实际上大多数编译器(所有标准架构的主流编译器)都实现了 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

关于c - 将被零除定义为无穷大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56644606/

相关文章:

c - strtok 导致段错误,但在单步执行代码时则不会

c++ - 混合 C/C++ 代码产生 "undefined symbol"与共享库

c - 提高 MacOS X 上的 mmap/munmap 性能

c - 如何使用 Clion 导出 .c 文件,我需要它在分时终端中

c - 我如何正确指向这段内存以将其视为我的结构?

c++ - const void 有什么意义?

c - iconv - 保留无法转换为 ascii 的字符

c - 像素没有被绘制到屏幕上并且无法退出。可能是 MacOSX 相关的错误?

c - 为什么我的模拟聊天服务写了错误的内容?

c - 程序 "double reading"一个字符串