Странное поведение при выполнении запроса на postgresql - PullRequest
1 голос
/ 10 февраля 2012

Я попытаюсь объяснить, что случилось со мной, не вставляя каждый отдельный фрагмент моего кода, потому что это много.

Если я запускаю этот запрос один, он возвращает 6.0 (ожидаемое поведение)

select distancia_euclediana_para_imagenes(vector_cuadrante1,
                       vector_cuadrante2,
                       vector_cuadrante3,
                       vector_cuadrante4,
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)])
from imagen,pivotes 
where id=id_imagen and indice_pivote=2

, и если я запускаю этот другой запрос, он возвращает 2 (снова ожидаемое поведение)

with distancia_a_pivote(distancia) as
(select distancia_euclediana_para_imagenes(vector_cuadrante1,
                       vector_cuadrante2,
                       vector_cuadrante3,
                       vector_cuadrante4,
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)])
from imagen,pivotes 
where id=id_imagen and indice_pivote=2)
select id from imagen, indice, distancia_a_pivote d
where id=id_imagen  and
fqa[2]>= 6-1 and
fqa[2]<= d.distancia+1;

Однако, с этим небольшим изменением он перестает работать и ничего не возвращает

with distancia_a_pivote(distancia) as
(select distancia_euclediana_para_imagenes(vector_cuadrante1,
                       vector_cuadrante2,
                       vector_cuadrante3,
                       vector_cuadrante4,
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)],
                       ARRAY[SQRT(8),SQRT(8)])
from imagen,pivotes 
where id=id_imagen and indice_pivote=2)
select id from imagen, indice, distancia_a_pivote d
where id=id_imagen  and
fqa[2]>= d.distancia-1 and
fqa[2]<= d.distancia+1;

Буду благодарен, если вы поможете мне, потому что я понятия не имею, что может вызвать эту проблему.Кроме того, я программировал в стиле TDD, поэтому у меня есть тесты, чтобы доказать правильное поведение, и я был очень доволен, что это сработает

Спасибо

1 Ответ

1 голос
/ 10 февраля 2012

Вы говорите, что fqa[2] - это целое число 5, а d.distancia - это значение с плавающей запятой , значение 6.0.Это означает, что вы в конечном итоге посмотрите на это:

5 >= 6.0 - 1

То, что 6.0, вероятно, не является точным, поэтому 6.0 - 1 может дать оттенок меньше 5,0, и ваше сравнение будет неудачным.Одно из решений состоит в том, чтобы добавить немного простора для учёта обычных проблем с плавающей запятой:

fqa[2] >= d.distancia - 1.00001 and
fqa[2] <= d.distancia + 1.00001

0,00001 - это всего лишь пример, вам нужно взглянуть на ситуацию, чтобы узнать, сколько лишних выдолжно позволять.Добавление вызовов ceil и floor может быть еще одним вариантом, поскольку они позволят вам лучше контролировать преобразование с плавающей запятой в целое.

...