c++ - 以 double 返回错误代码

标签 c++ c comparison point floating

我想知道我是否可以在 C 中按以下方式将错误代码返回为 double:

double getValue()
{
    double ret = 0;

    if (error1)
    {
        return -1;
    }
    if (error2)
    {
        return -2;
    }
    return ret = ....;
}

int main(void)
{
    double val = getValue();

    if (-1 == val)
    {
        printf("getValue: error1\n")
        return -1;
    }
    else if (-2 == val)
    {
        printf("getValue: error2\n");
        return -2;
    }

    ......
    return 0;
}

所以当返回值 >= 0 时,它就是可以用于计算的正确值。当值小于零时发生错误。 当我将返回值与 -1 或 -2 进行比较时,会遇到浮点比较问题吗?

最佳答案

标志值不是一个好主意。浮点型标志值是 double 的,即使是 double 也是如此。

如果您使用 IEEE double 浮点值,值 -1-2 可以精确表示为 double,并且比较定义明确。如果您只是复制 double 或只读取值,则不会出现“魔法错误”。事实上,在具有传统 2 补码 32 位 int 的系统上,每个 int 都可以精确地表示为 IEEE double 浮点值。

现在,您认为转换并不重要,例如 x/3。 * 3. 会破坏标识,因此代码非常脆弱:脆弱既是因为标志值是脆弱的,也是因为浮点等价在实践中通常是脆弱的。

在 C++ 中,有无数种方法可以做到这一点,而且不那么脆弱。

enum error_code {a,b,c};
boost::variant<double, error_code> getValue();

是一个标记的 union ,可以包含一个 double 或一个 error_code。有一个 std::expected 提案,你可以看看它是一个标记 union ,它对第一个值是唯一有效的值有“偏见”(有点像 std::experimental::optionalboost::variant).

这两者都会导致以类型安全的方式返回值,其中错误是与非错误返回类型不同的类型值。

替代解决方案包括单独返回错误代码(作为返回值,或将指向错误代码的指针作为参数(我称之为 ICU 样式))。在这种情况下,double 可以设置为一些无害的值(例如,NaN),而不是保持未初始化状态。

double getValue( error_code* e );

error_code getValue( double* out );

其中 enum error_code { a = -1, b = -2 } 是错误代码的枚举。

关于c++ - 以 double 返回错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29109303/

相关文章:

c++ - 写一个循环读取十个数字然后输出它们

c - 如何为JNI对象数组动态分配内存

c - 在信号处理程序中运行 TAILQ

comparison - 如果不完全相同,则比较声音文件

c++ - 如何从具有 null(0) 字符的 char 数组创建 C++ istringstream?

c++ - 在哪里可以找到 C++ DNS 库?

c - 使用结构体中定义的类型作为结构体内部函数参数的类型

python - 将一个字典的值与另一个字典的键匹配 (Python)

python - 如何测试多个变量与单个值的相等性?

c++ - 在编译时将文本文件导入到 std::string