当前位置: 首页 > 知识库问答 >
问题:

表示整数的双精度除法(当它们可除时)

凤晨朗
2023-03-14

考虑到8字节的双精度可以精确地表示所有4字节的整数,我想知道将存储整数的双精度a除以存储整数的双精度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很难处理ints,所以我通常只使用默认的double进行整数计算。当我知道整数是可整除的,如果我知道现在这个问题的答案是肯定的,那么我可以避免对整数进行强制转换,idivide(…) 等,可读性较差。


共有1个答案

陆仲渊
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 对于此代码块: 的值d就是0.0。它可以通过强制转换来工作: 但是还有另一种方法来获得正确的结果吗?我不喜欢强制转换原语,谁知道会发生什么。 问题答案: 这样可以避免强制转换。但是你会发现强制转换的定义很明确。你不必猜测,只需检查JLS即可。从int到double是一个不断扩大的转换。从第5.1.2节开始:

  • 对于实现精确 IEEE 754 算术的 C99 编译器,是否存在型的 、的值,使得 ? 编辑:所谓“实现精确的IEEE754算法”,我指的是一个正确地将FLT_EVAL_METHOD定义为0的编译器。 提供符合IEEE 754标准的浮点数的C编译器只能将单精度除法替换为常数,如果所述逆本身可以完全表示为。 实际上,这种情况只发生在2的幂上。因此,程序员Alex可能确信< code>f / 2.0f

  • 问题内容: 当我使用双精度数在Java中将317除以219时,得到1。 例如: 输出为:1。 这是因为它是重复的小数吗?不得不使用BigDecimal代替,这很烦人。 问题答案: 试试这个 java中编码数字的默认类型是,因此使用现有的代码,java正在使用两个数字,并且除法的结果也将是,这将截断小数部分以得出最终结果。然后将此结果从转换为,而没有编译器警告,因为它是 扩大的转换 (保证源类型“适

  • 问题内容: 为什么会收到错误,我该如何解决? 如您所见,在声明变量时,我已经尝试过用顶部附近的位置进行替换,但是似乎并没有完成任务。 问题答案: 更改使用数组索引从double到INT所有变量(即变量,,)。数组索引是整数。

  • 问题内容: 从双精度中删除尾随零的功能是什么? 问题答案: 在Swift 4中,您可以这样做: 使用示例: 结果:128834.567891 您还可以计算字符串中有多少个十进制数字:

  • 问题内容: 我想删除所有结尾的零而不截断或舍入该数字(如果没有的话)。例如,数字可能类似于,在这种情况下,尾随零应被删除。但是这个数字也可能 几乎是 不合理的,比如在屏幕的边缘。有没有办法设置DecimalFormat或其他类以减少尾随的零,同时保持不合理性不变? 问题答案: 如果您愿意切换到,则可以使用#stripTrailingZeroes()方法来完成此操作。