如果a和b都是> 0的整数,想知道下面的断言是否正确.浮点数精度会导致这种情况下的问题吗?
assert(a%b || floor(a/(double)b)*b==a);
Run Code Online (Sandbox Code Playgroud)
如果条件的第一部分为假,a则为倍数b.
转换为double整数通常是精确的(如果double是IEEE 754的binary64,则对于高达2 53的整数是精确的).假设这些条件下,a/(double)b是double最靠近的实数除法a由b.由于实际结果是低于2 53的整数,因此它是完全可表示的,因此不会发生舍入(换句话说,浮点除法是精确的).
floor()应用于double表示整数的整数返回相同的整数.
由于与除法相同的原因,浮点乘法是精确的,并且精确地生成a.
结论:在该条件assert始终是真的,因为a和b-2之间53和2 53,用于实现一个平台double为binary64,有或没有多余的精度.