表示整数的二重的精确除法(当它们可整除时)



考虑到8字节的双精度可以精确地表示所有4字节的int,我想知道用存储int的双精度a除以存储int的单精度B(这样整数B除以a)是否总是给出与作为其商的整数对应的精确双精度?因此,如果B和C是整数,并且B*C适合32位整数,那么是否保证

int B,C = whatever s.t. B*C does not overflow 32-bit int
double(B*C)/double(C) == double((B*C)/C) ?

IEEE754标准能保证这一点吗?

在我的测试中,它似乎适用于我尝试过的所有示例。在Python中:

>>> (321312321.0*3434343.0)/321312321.0 == 3434343.0
True

之所以提出这个问题,是因为Matlab很难处理int,所以我经常只使用默认的doubles进行整数计算。当我知道整数是完全可整除的,如果我知道当前问题的答案是肯定的,那么我就可以避免对int、idivide(..)等进行强制转换,因为它们可读性较差。

Luis Mendo的评论确实回答了这个问题,但为了具体解决Matlab中的使用问题,这里描述了一些方便的实用程序。您可以使用eps(numberOfInterest)来查找到下一个最大双精度浮点数的距离。例如:

eps(1) = 2^(-52)
eps(2^52) = 1

这实际上保证了以双精度保存整数的数学运算是精确的,前提是它们不会溢出2^52,而2^52比32位int类型中保存的要大很多。

最新更新