精确划分表示整数的双精度(当它们可分割时)

时间:2014-04-21 07:43:49

标签: matlab division ieee-754 integer-division double-precision

鉴于8-byte doubles can represent all 4-byte ints precisely,我想知道是否将存储一个int的双A划分为一个存储一个int的双B(这样整数B除以A)将始终给出对应于整数的精确双精度那是他们的商数?所以,如果B和C是整数,并且B * C适合32位int,那么它是否保证

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难以使用整数,所以我经常只使用默认双精度进行整数计算。当我知道整数完全可以被整除时,如果我知道当前问题的答案是肯定的,那么我可以避免对整数进行强制转换,idivide(..)等等,这些不太可读。

1 个答案:

答案 0 :(得分:1)

路易斯·门多的评论确实回答了这个问题,但为了专门解决在Matlab中的使用,有一些方便的实用工具described here。您可以使用eps(numberOfInterest)查找到下一个最大双精度浮点数的距离。例如:

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

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