Tag: 除以

安全浮点分部

我的代码中有一些地方,我想确保2个任意浮点数(32位单精度)的除法不会溢出。 目标/编译器不保证(明确地)对-INF / INF的良好处理和(不完全保证IEEE 754的exception值 – (可能未定义) – 并且目标可能会改变)。 此外,我无法对这几个特殊地点的输入进行保存,我必须使用C90标准库。 我已经读过每个计算机科学家应该知道的关于浮点算术的内容但是说实话,我有点迷失了。 所以……我想问一下社区,如果以下代码可以解决问题,并且有更好/更快/更高/更正/更正的方法: #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; } 编辑:根据Pascal Cuoq的建议,将((abs_denum * […]

为什么这个除法导致零?

当我遇到以下问题时,我在C中编写此代码。 #include int main() { int i=2; int j=3; int k,l; float a,b; k=i/j*j; l=j/i*i; a=i/j*j; b=j/i*i; printf(“%d %d %f %f\n”,k,l,a,b); return 0; } 谁能告诉我为什么代码为第一个和第三个变量( k和a )返回零?