1

我将尝试解释发生在我身上的事情,而不是粘贴我的每一段代码,因为它很多。

如果我单独运行此查询,它将返回 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 风格进行编码,所以我有测试来证明正确的行为,而且我很高兴它会起作用

谢谢

4

1 回答 1

1

你说那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 只是一个例子,你需要看看你的情况,看看你应该允许多少额外的。添加ceilfloor调用可能是另一种选择,因为它们可以让您更好地控制浮点到整数的转换。

于 2012-02-10T02:45:08.960 回答