gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:37:34 25 4
gpt4 key购买 nike

我想知道我是否可以在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com