gpt4 book ai didi

c - 安全浮点除法

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

在我的代码中有一些地方我想确保 2 个任意 float (32 位单精度)的除法不会溢出。目标/编译器不保证(足够明确地)很好地处理 -INF/INF 和(不完全保证 IEEE 754 的异常值 - (可能未定义) - 并且目标可能会改变)。此外,我无法对这几个特殊位置的输入进行保存假设,而且我必须使用 C90 标准库。

我已阅读 What Every Computer Scientist Should Know About Floating-Point Arithmetic但老实说,我有点迷茫。

所以...我想问问社区,下面的代码是否可以解决问题,以及是否有更好/更快/更准确/更正确的方法来做到这一点:

#define SIGN_F(val) ((val >= 0.0f)? 1.0f : -1.0f)

float32_t safedivf(float32_t num, float32_t denum)
{
const float32_t abs_denum = fabs(denum);
if((abs_denum < 1.0f) && ((abs_denum * FLT_MAX) <= (float32_t)fabs(num))
return SIGN_F(denum) * SIGN_F(num) * FLT_MAX;
else
return num / denum;
}

编辑:已更改 ((abs_denum * FLT_MAX) < (float32_t)fabs(num))((abs_denum * FLT_MAX) <= (float32_t)fabs(num))正如 Pascal Cuoq 所推荐的那样。

最佳答案

您可以尝试提取 num 和 denum 的指数和尾数,并确保条件:

((exp(num) - exp (denum)) > max_exp) &&  (mantissa(num) >= mantissa(denum))

并根据输入的符号,生成相应的INF。

关于c - 安全浮点除法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25310051/

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