想知道下面的断言是否正确,如果a和b都是大于0的整数。在这种情况下浮点数精度会引起问题吗?
assert(a%b || floor(a/(double)b)*b==a);
如果条件的第一部分为假,a
则为的倍数b
。
到转换double
的整数的通常是精确(如果double
是IEEE 754的binary64,它是确切为整数高达2 53)。假设这些条件下,a/(double)b
是double
最靠近的实数除法a
由b
。由于实际结果是小于2 53的整数,因此它可以精确表示,因此不会进行舍入(换句话说,浮点除法是精确的)。
floor()
应用于double
代表整数的,将返回相同的整数。
出于与除法相同的原因,浮点乘法是精确的,并且精确地产生a
。
结论:assert
对于-2 53和2 53之间a
以及b
介于-2 53和2 53之间的条件,对于实现double
为binary64的平台,无论是否具有过高的精度,该条件始终是正确的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句