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)
如果这是可能的,任何人都可以提供一个例子a和b?如果这是不可能的,是否有任何java或浮点规范证明这一点?
几分钟前我写了这个逻辑,突然担心它破了.我一直无法打破它,但我想知道它是否能在所有JVM中得到保证.
如果a和b是正的int值,然后a/(double)b >= a/b.
我使用以下前提,以及理解的语义,例如将int值a/b转换double为与其他操作数进行比较>=.
物业:
int是[-2,147,483,648,2,147,483,648).double 是IEEE 754 64位二进制文件.a/b截断为零.符号:
a.b.a/b.a/(double)b.a/b.证明:
int值都以表示的double,所以IEEE 754要求转换int到double准确.(double) a并准确地(double) b产生a和b,并a/(double)b产生正确舍入到最近的a/bdouble.double.double最近的a/b.如果L通过四舍五入减少,则减少到下一个更低double.由于这个量级的所有整数都是可表示的,因此floor(a/b)是可表示的,因此L至少是floor(a/b).double是精确的,所以比较大号到ř与>=产生相同的结果为数学大号 ≥ [R .