floor(a /(double)b)*b == a如果a%b == 0 in C?

poo*_*per 3 c floating-point

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

assert(a%b || floor(a/(double)b)*b==a);
Run Code Online (Sandbox Code Playgroud)

Pas*_*uoq 8

如果条件的第一部分为假,a则为倍数b.

转换为double整数通常是精确的(如果double是IEEE 754的binary64,则对于高达2 53的整数是精确的).假设这些条件下,a/(double)bdouble最靠近的实数除法ab.由于实际结果是低于2 53的整数,因此它是完全可表示的,因此不会发生舍入(换句话说,浮点除法是精确的).

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

由于与除法相同的原因,浮点乘法是精确的,并且精确地生成a.

结论:在该条件assert始终是真的,因为ab-2之间53和2 53,用于实现一个平台double为binary64,有或没有多余的精度.