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