Re: Floating point comparison inconsistencies of the geometric types - Mailing list pgsql-hackers
From | Kyotaro HORIGUCHI |
---|---|
Subject | Re: Floating point comparison inconsistencies of the geometric types |
Date | |
Msg-id | 20161121.153334.61413526.horiguchi.kyotaro@lab.ntt.co.jp Whole thread Raw |
In response to | Re: Floating point comparison inconsistencies of the geometric types (Emre Hasegeli <emre@hasegeli.com>) |
List | pgsql-hackers |
Hello, # Sorry for a trash I emitted before.. Perhaps you don't assume any calculations applied on stored geo-type values. Please be patient to disucuss with me. (Sorry for perhas hard-to-read English..) At Fri, 18 Nov 2016 10:58:27 +0100, Emre Hasegeli <emre@hasegeli.com> wrote in <CAE2gYzxVxKNS7qU74UdHVZTmfXQjxMbFiXH5+16XFy90SRAbXA@mail.gmail.com> > > To keep such kind of integrity, we should deeply consider about > > errors. > > My point is that I don't think we can keep integrity together with the > fuzzy behaviour, or at least I don't have the skills to do that. I > can just leave the more complicated operators like "is a > point on a line" as it is, and only change the basic ones. Do you > think a smaller patch like this would be acceptable? The size of the patch is not a matter. It broken the current behavior is a matter. It shows strange behavior for some cases but it designed to work reasonable for some cases. > > That's a fate of FP numbers. Btree is uasble for such data since > > it is constructed using inequality operators but hash is almost > > unsuitable without rounding and normalization because of the > > nature of floating point numbers. Range scan on bree will work > > find but on the other hand equality doesn't work even on btree > > index from the same reason to the below. > > Btree is very useful with floats. There is no problem with it. I don't mind btrees on bare floats. It will 'work' if error is properly considered, or error can be omitted for the purpose. Point has some kind of physical context or expected behavior other than that of bare floats which the EPSILON implies. > > Again, FP numbers generally cannot match exactly each other. You > > have to avoid that. > > Again, they do match very well. Floating point numbers are no magic. > They are perfectly deterministic. No magic, yes, so it is always accompanied by error. If you store points, then searching for *any of them*, it works fine. It's no magic. If you obtained a ponit from any physical data source, say GPS receiver, then search identical points from a table, it would be almost impossible to find a "exactly the same" location. It's no magic. Once a calculation has been applied on them, it is no longer guaranteed to work in the same way. It's also no magic. CREATE OR REPLACE FUNCTION rotate_point (integer, float8) RETURNS void AS $$ UPDATE p SET x = x * cos($2) - y * sin($2),y = x * sin($2) + y * cos($2) WHERE i = $1 $$ LANGUAGE SQL; ALTER TABLE p (i int, x float8, y float8); INSERT INTO p VALUES (0, 1.0, 1.0), (1, 1.0, 1.0); SELECT rotate_point(0, pi() * 2.0 / 3.0); SELECT rotate_point(0, pi() * 2.0 / 3.0); SELECT rotate_point(0, pi() * 2.0 / 3.0); SELECT * FROM p WHERE i = 0;i | x | y ---+---+-------------------0 | 1 | 0.999999999999999 So SELECT p0.x = p1.x AND p0.y = p1.y FROM p p0, p p1 WHERE p0.i = 0 and p1.i = 1;?column? ----------f (1 row) This just repeats 1/3 rotation 3 times. Ideally p0 and p1 are identical but this primitive operation generates visible error that makes the comparison fail. Even though these two points are expected be identical in some geometric viewpoint. This is a part of the meaning of the EPSILON. -- Kyotaro Horiguchi NTT Open Source Software Center
pgsql-hackers by date: