【发布时间】:2018-02-22 07:35:00
【问题描述】:
我计划使用特殊的浮点值从函数中重新运行错误代码,例如 99.75f 可以在 IEEE-754 中表示:
float myFunction(void)
{
/* Do some stuff */
if(error) return 99.75f;
}
稍后检查如下值:
float result = myFunction();
if(result == 99.75f) printf("Error !");
假设我的编译器符合 C90 或 C99 标准,此解决方案是否可移植?它适用于任何平台吗? 或者编译器是否允许做一些魔法或一些优化,将浮点数转换为双精度,改变它的表示等,这会破坏相等性检查吗?
著名的What Every Computer Scientist Should Know About Floating-Point Arithmetic 似乎没有涵盖这种情况(特定于C)。 与 FLT_EPSILON 或 ULP 进行比较是无关紧要的,因为我确实想检查浮点数的表示...
【问题讨论】:
-
便携?也许(如果您只关心使用 IEEE-754 的实现)。好习惯?绝对不。另一种选择是单独返回错误指示,即
float myFunction(int *error)或int myFunction(float *result) -
@user3386109 您能否详细说明答案中的不良做法? (请注意,CPython 源代码做了一些事情very similar。)
-
@MarkDickinson 那么也许你应该是一个发布答案的人,指出 CPython 是一个良好实践的例子。
-
@user3386109:是的,这是一种糟糕的做法,就像使用函数中的
int返回码有时返回一个值(传输的字节数、流数、转换的参数数),有时返回返回错误指示(资源不可用,EOF)或使用指针表示地址或缺少地址 (NULL)。 -
我所要做的就是等待,因为要进行维护。不了解浮点数所有细微差别的人会触及该代码,整个事情就会爆炸。这就是使它成为不好的做法的原因。不像说返回
NULL。使用NULL,您不需要一堵文字墙来解释为什么您绝对确定自己可能相当安全。
标签: c floating-point comparison portability