为什么Box2D必须使用浮点值



使用Jbox-2D引擎查看代码后,很明显,Float声明经常使用:

float x = 20.0f //<-- float
FixtureDef fixDef = new FixtureDef();
fixDef.shape = shape;
fixDef.density = 0.0f; //<-- float
fixDef.friction = 0.9f; //<-- float

我已经修补了,发现当代码不被指定为浮子时,该代码会正确符合。因此,我的问题是:

为什么编码器必须将值定义为Jbox-2D中的浮动,即使存储在其中的变量已经被声明为float?

如果要将0.9之类的数字分配给浮点是双重的,然后从双重到浮动。将其宣布为" float"字面意义,其中" f"永远不会比宣布双重并施放浮动更糟。

与宣布与浮点文字相同的值相比,将int字面的字面分配给浮点没有精确的损失,但是如果在float中完成一切,都可以使所有文字浮动更加整洁,而不仅仅是非全能的。这样,如果文字后来从整数更改为分数,则" F"就已经存在。

=========================================================================================

问题的根源是在从小数线到两倍的转换过程中有关文字的信息丢失。以下是如何发生这种情况的示例。

假设小数分数非常略大于两个相邻浮子之间的一半,而两个浮子的下部甚至是均匀的(最后一个位为零)。

小数分数更靠近两个浮子中的较大,因此直接转换为浮子时,它绕过它。如果转换是通过double完成的,则可以双重丢失该信息的舍入。双向转换使用圆形转换 - 甚至在两个相邻浮子之间映射了一半的一半,在这种情况下,在这种情况下,较小的浮子。

这是一个证明这一点的程序:

import java.math.BigDecimal;
public class Test {
  public static void main(String[] args) {
    BigDecimal exactValue = new BigDecimal("1.5000000596046447753906251");
    System.out.println("Exact = " + exactValue);
    double d = 1.5000000596046447753906251;
    BigDecimal dValue = new BigDecimal(d);
    System.out.println("dValue = " + dValue);
    float f1 = 1.5000000596046447753906251f;
    BigDecimal f1Value = new BigDecimal(f1);
    System.out.println("f1Value = " + f1Value);
    float f2 = (float) 1.5000000596046447753906251;
    BigDecimal f2Value = new BigDecimal(f2);
    System.out.println("f2Value = " + f2Value);
    System.out.println("f1 error = "
        + exactValue.subtract(f1Value).abs());
    System.out.println("f2 error = "
        + exactValue.subtract(f2Value).abs());
  }
}

输出:

Exact = 1.5000000596046447753906251
dValue = 1.500000059604644775390625
f1Value = 1.50000011920928955078125
f2Value = 1.5
f1 error = 5.96046447753906249E-8
f2 error = 5.96046447753906251E-8

直接转换的结果,F1的绝对舍入误差小于F2的绝对舍入误差,这是通过双重转换的结果。

最新更新