result
可能会错误,因为4 / 2.0
可能会返回1.99999999
之类的内容吗?比标题更普遍:
int a = // any valid int
int b = // any valid int
boolean result = (a/(double)b) >= a/b;
如果可以,有人可以提供a
和b
的示例吗?如果这是不可能的,是否有任何证明这一点的java或浮点规范?
答案 0 :(得分:5)
如果a
和b
的值为int
,则为a/(double)b >= a/b
。
我使用以下前提以及理解的语义,例如int
的{{1}}值将转换为a/b
,以便与{{1}的其他操作数进行比较}}
物业:
double
的范围是[-2,147,483,648,2,147,483,648]。>=
是IEEE 754 64位二进制文件。int
截断为零。符号:
double
的数学值。a/b
的数学值。a
等计算表达式不同。b
生成的值。a/b
生成的值。证明:
a/(double)b
值均可在a/b
中表示,因此IEEE 754要求将int
转换为double
。int
和double
完全生成 a 和 b ,(double) a
生成 a / b 正确舍入到最近的(double) b
。a/(double)b
。double
最近的 a / b 。如果通过舍入减少 L ,则减少到下一个double
。由于此幅度的所有整数都是可表示的,因此floor( a / b )是可表示的,因此 L 至少为floor( a / b'/ I>)。double
是准确的,因此 L 与 R 与double
的比较产生与数学 L ≥ R 相同的结果。答案 1 :(得分:2)
对于负数,a = -10,b = 3时失败。
仅对于积极的投入,我认为你是安全的。
设x是除以b的实数结果。
首先考虑x可表示为int的情况。它也可以表示为double,两个计算都返回x。
现在假设x不是int。问题是x和a /(double b)之间的舍入误差差的绝对值是否会超过a / b的截断误差。它不能。
截断误差t = x - a / b必须至少为1 / b。 x不能大于Integer.MAX_VALUE / b,因此t / x至少为1 / Integer.MAX_VALUE。这远远大于正确舍入的双重计算的最大舍入误差。
答案 2 :(得分:0)
4 / 2.0
必须返回2.0
,因为浮点除法是准确的。
负数可能会导致您的比较失败。请注意-1/2 = 0
和-1.0/2.0 = -0.5
。