Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 浮点错误是否会导致“a/(double)b>=a/b”失败?_Java_Floating Point - Fatal编程技术网

Java 浮点错误是否会导致“a/(double)b>=a/b”失败?

Java 浮点错误是否会导致“a/(double)b>=a/b”失败?,java,floating-point,Java,Floating Point,因为4/2.0可能返回类似于1.9999999的值,所以结果是否可能为假?比标题更一般地说: int a = // any valid int int b = // any valid int boolean result = (a/(double)b) >= a/b; 如果这是可能的,有人能提供a和b的例子吗?如果这是不可能的,是否有任何java或浮点规范可以证明这一点 我几分钟前写下了这个逻辑,突然担心它会崩溃。我一直无法打破它,但我想知道它是否在所有JVM中都有保证。4/2.0必须

因为4/2.0可能返回类似于1.9999999的值,所以结果是否可能为假?比标题更一般地说:

int a = // any valid int
int b = // any valid int
boolean result = (a/(double)b) >= a/b;
如果这是可能的,有人能提供a和b的例子吗?如果这是不可能的,是否有任何java或浮点规范可以证明这一点

我几分钟前写下了这个逻辑,突然担心它会崩溃。我一直无法打破它,但我想知道它是否在所有JVM中都有保证。

4/2.0必须返回2.0,因为浮点除法是精确的

负数可能会导致比较失败。请注意,-1/2=0,而-1.0/2.0=-0.5。

4/2.0必须返回2.0,因为浮点除法是精确的


负数可能会导致比较失败。请注意,-1/2=0,而-1.0/2.0=-0.5。

对于负数,a=-10,b=3失败

仅就积极投入而言,我认为你是安全的

设x为a除以b的实数结果

首先考虑X是可表示为int的情况,它也可以表示为双,并且两个计算都返回X.

现在假设x不是int,问题是x和a/double b之间的舍入误差差的绝对值是否会超过a/b的截断误差。它不能


截断错误t=x-a/b必须至少为1/b。x不能大于Integer.MAX_值/b,因此t/x至少为1/Integer.MAX_值。这比正确四舍五入的双精度计算的最大四舍五入误差要大得多。

对于负数,a=-10,b=3失败

仅就积极投入而言,我认为你是安全的

设x为a除以b的实数结果

首先考虑X是可表示为int的情况,它也可以表示为双,并且两个计算都返回X.

现在假设x不是int,问题是x和a/double b之间的舍入误差差的绝对值是否会超过a/b的截断误差。它不能

截断错误t=x-a/b必须至少为1/b。x不能大于Integer.MAX_值/b,因此t/x至少为1/Integer.MAX_值。这比正确四舍五入的双精度计算的最大四舍五入误差大得多。

如果a和b是正整数值,则a/doubleb>=a/b

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

场所:

int的范围是[-2147483648,2147483648。 double是IEEE 754 64位二进制文件。 舍入模式为舍入到最近。 所有浮点运算,特别是除法运算,都符合IEEE 754。 整数a/b向零截断。 符号:

a是a的数学值。 b是b的数学值。 数学表达式(如a/b)是精确的,与计算表达式(如a/b)不同。 设L为a/B产生的值。 设R为a/b产生的值。 证明:

所有int值都可以用double表示,因此IEEE 754要求将int转换为double是精确的。 因此,双精度a和双精度b可以精确地生成a和b,而a/doubleb可以正确地将a/b四舍五入到最接近的双精度。 因为R是向零截断的a/b,并且a/b是正的,所以R是floora/b。 最大a/b值为2147483647/1=2147483647。此量级及以下的每个整数都可精确表示为双精度。 L是最接近a/b的双精度。如果L通过四舍五入减少,它将减少到下一个较低的双精度。由于此量级的所有整数都是可表示的,所以floora/b是可表示的,所以L至少是floora/b。 所以我≥ R R到double的转换是精确的,因此用>=比较L到R会产生与数学L相同的结果≥ R 如果a和b是正整数值,则a/doubleb>=a/b

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

场所:

int的范围是[-2147483648,2147483648。 double是IEEE 754 64位二进制文件。 舍入模式为舍入到最近。 所有浮点运算,特别是除法运算,都符合IEEE 754。 整数a/b向零截断。 符号:

a是a的数学值。 b是b的数学值。 数学表达式(如a/b)是精确的,与计算表达式(如a/b)不同。 设L为a/B产生的值。 设R为a/b产生的值。 证明:

所有int值都可以用double表示,因此IEEE 754要求将int转换为double是精确的。 因此,双精度a和双精度b可以精确地生成a和b,而a/doubleb可以正确地将a/b四舍五入到最接近的双精度。 因为R是向ze方向截断的a/b ro,a/b为正,R为楼层/b。 最大的a/b可以是2147483647/1=2147483647。这个量级及以下的每个整数都可以精确地表示为双精度。 L是离a/b最近的两倍。如果L通过四舍五入减少,则减少到下一个较低的双精度。因为这个量级的所有整数都是可表示的,所以floora/b是可表示的,所以L至少是floora/b。 所以我≥ R R到double的转换是精确的,因此用>=比较L到R会产生与数学L相同的结果≥ R
+以1为例。但是,浮点除法是精确的,需要一定的条件;你到底是什么意思?也因为这些是二进制数字,不是吗?4/2.0是4*2^-1,IIRC表示浮点数的存储方式。@OliCharlesworth:两个浮点数的除法总是返回与商最接近的浮点数。您能详细介绍精确浮点数的定义吗?我假设计算1/3会得到0.33333。。。精确到一定程度,但永远不会等于真正精确的数学值1/3。IEEE 754标准中使用的术语是“正确四舍五入”。生成的结果通常在数学上不精确,但它是根据舍入模式正确舍入的数学上精确的结果。在“四舍五入到最近”模式中,这是最接近的可表示结果,与偶数低位相关。还有其他模式可以产生更远的结果。例如+1。但是,浮点除法是精确的,需要一定的条件;你到底是什么意思?也因为这些是二进制数字,不是吗?4/2.0是4*2^-1,IIRC表示浮点数的存储方式。@OliCharlesworth:两个浮点数的除法总是返回与商最接近的浮点数。您能详细介绍精确浮点数的定义吗?我假设计算1/3会得到0.33333。。。精确到一定程度,但永远不会等于真正精确的数学值1/3。IEEE 754标准中使用的术语是“正确四舍五入”。生成的结果通常在数学上不精确,但它是根据舍入模式正确舍入的数学上精确的结果。在“四舍五入到最近”模式中,这是最接近的可表示结果,与偶数低位相关。还有其他模式可以在更远的地方产生效果。感谢大家的热烈和彻底的回应!感谢您的热烈而彻底的回应!