c - floor(a/(double)b​​)*b==a 如果 a%b==0 在 C 中?

标签 c floating-point

想知道如果 a 和 b 都是 > 0 的整数,下面的断言是否正确。在这种情况下, float 精度会导致问题吗?

assert(a%b || floor(a/(double)b)*b==a);

最佳答案

如果条件的第一部分为假,则 ab 的倍数。

整数到 double 的转换通常是精确的(如果 double 是 IEEE 754 的 binary64,它对于最大 253).假设这些条件,a/(double)b​​ 是最接近 a 除以 bdouble .由于实际结果是一个小于 253 的整数,它是可以精确表示的,所以不会发生舍入(换句话说,浮点除法是精确的)。

floor() 应用于表示整数的 double 返回相同的整数。

出于与除法相同的原因,浮点乘法是精确的,并且恰好产生 a

结论:assert中的条件总是为真,对于ab在-253之间和 253,用于将 double 实现为 binary64 的平台,有或没有超精度。

关于c - floor(a/(double)b​​)*b==a 如果 a%b==0 在 C 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339402/

相关文章:

java - 编辑异常 e 以捕获字母而不是小数

将数组转换为 int/float

c - 运行时错误: Structure for student details in C

c - 如何从用户空间挂起 Linux 中的 i2c 设备?

c - strcpy() 返回值

java - 以圆形路径移动 ImageView

c++ - 手动替代消息映射?

条件跳转或移动取决于未初始化的值 - C valgrind

math - float 学有问题吗?

floating-point - 什么时候非范数真正有用?