浮点错误会导致'a /(double)b> = a/b'失败吗?

Cor*_*all 1 java floating-point

可能result是假的,因为4 / 2.0可能会返回类似的东西1.99999999?比标题更普遍:

int a = // any valid int
int b = // any valid int
boolean result = (a/(double)b) >= a/b;
Run Code Online (Sandbox Code Playgroud)

如果这是可能的,任何人都可以提供一个例子ab?如果这是不可能的,是否有任何java或浮点规范证明这一点?

几分钟前我写了这个逻辑,突然担心它破了.我一直无法打破它,但我想知道它是否能在所有JVM中得到保证.

Eri*_*hil 5

如果ab是正的int值,然后a/(double)b >= a/b.

我使用以下前提,以及理解的语义,例如将inta/b转换double为与其他操作数进行比较>=.

物业:

  • 范围int是[-2,147,483,648,2,147,483,648).
  • double 是IEEE 754 64位二进制文​​件.
  • 舍入模式是舍入到最接近的.
  • 所有浮点运算,特别是除法,都符合IEEE 754.
  • 整数a/b截断为零.

符号:

  • a是数学值a.
  • b是数学值b.
  • 数学表达式,例如a/b,是精确的,与计算表达式不同,例如a/b.
  • L为生成的值a/(double)b.
  • R为生成的值a/b.

证明:

  • 所有int值都以表示的double,所以IEEE 754要求转换intdouble准确.
  • 因此,(double) a并准确地(double) b产生ab,并a/(double)b产生正确舍入到最近的a/bdouble.
  • 由于Ra/b截断为零,并且a/b是正的,因此R是floor(a/b).
  • 最大的a/b可以是2,147,483,647/1 = 2,147,483,647.此大小及以下的每个整数都可以完全表示为a double.
  • Ldouble最近的a/b.如果L通过四舍五入减少,则减少到下一个更低double.由于这个量级的所有整数都是可表示的,因此floor(a/b)是可表示的,因此L至少是floor(a/b).
  • 因此大号[R .
  • 的转化řdouble是精确的,所以比较大号ř>=产生相同的结果为数学大号[R .