想知道如果 a 和 b 都是 > 0 的整数,下面的断言是否正确。在这种情况下, float 精度会导致问题吗?
assert(a%b || floor(a/(double)b)*b==a);
最佳答案
如果条件的第一部分为假,则 a
是 b
的倍数。
整数到 double
的转换通常是精确的(如果 double
是 IEEE 754 的 binary64,它对于最大 253).假设这些条件,a/(double)b
是最接近 a
除以 b
的 double
.由于实际结果是一个小于 253 的整数,它是可以精确表示的,所以不会发生舍入(换句话说,浮点除法是精确的)。
floor()
应用于表示整数的 double
返回相同的整数。
出于与除法相同的原因,浮点乘法是精确的,并且恰好产生 a
。
结论:assert
中的条件总是为真,对于a
和b
在-253之间和 253,用于将 double
实现为 binary64 的平台,有或没有超精度。
关于c - floor(a/(double)b)*b==a 如果 a%b==0 在 C 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24339402/