浮点精度

时间:2014-01-11 14:32:30

标签: java floating-point

我正在编写一种方法,以a*x+b*y=1

的形式计算2D线的方程
//Given two points, find the equation of the line by solving two linear equations and then test the result. (For simplicity, assume that delta !=0 here)

private boolean solveAndRetry(float x1,float y1, float x2,float y2) {
        float delta = x1 * y2 - x2 * y1;
        float deltaA = y2 - y1;
        float deltaB = x1 - x2;

        float a = deltaA / delta;
        float b = deltaB / delta;
        float c = 1;

        //test
        if (a * x2 + b * y2 == c) {
        System.out.println("ok");
            return true;
        }
        else {
            System.out.println(a * x2 + b * y2-c);
            return false;
        }
    }

当我跑步时,我期待会有所有“确定”,但事实并非如此,我不知道为什么

public static void main(String[] args) {
        for (float x = 0; x < 10; x += 0.01f) {
            solveAndRetry(1, -1, x, 2);
        }
    }

以下是结果中的一些行

ok
ok
ok
ok
ok
ok
ok
ok
-5.9604645E-8
ok
-5.9604645E-8
ok
ok
ok
1.1920929E-7
ok
ok
-5.9604645E-8
ok

1 个答案:

答案 0 :(得分:3)

float的精确度为6到7位十进制数。由于舍入错误无法避免,因此您的结果尽可能好。

通常情况下,您永远不会比较浮点数是否相等。而不是x == y始终使用与间隔的比较:

Math.abs(x - y) < eps

适合选择的eps。