
|
If you were logged in you would be able to see more operations.
|
|
|
| Planning Status: |
Unspecified
|
|
The IEEE representation of single- and double-precision floating point values distinguish between positive and negative zeros. When they're compared naturally (using compiler generated code), everything is okay. But if they're stored in the index, they get compared byte-wise. As a result, searching for the negative zero cannot find the positive zero, and vice versa.
Test case:
select count(*) from rdb$relations where rdb$relation_id = 0
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = 0e0
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = (1e0 - 1e0)
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = -0e0
-- result = 0
select count(*) from rdb$relations where rdb$relation_id = -(1e0 - 1e0)
-- result = 0
In dialect 1 it could be reproduced without explicit floating point values:
select count(*) from rdb$relations where rdb$relation_id = (1 - 1)
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = -(1 - 1)
-- result = 0
At the same time:
select count(*) from rdb$database where 0e0 = -0e0
-- result = 1, as no index is involved
|
|
Description
|
The IEEE representation of single- and double-precision floating point values distinguish between positive and negative zeros. When they're compared naturally (using compiler generated code), everything is okay. But if they're stored in the index, they get compared byte-wise. As a result, searching for the negative zero cannot find the positive zero, and vice versa.
Test case:
select count(*) from rdb$relations where rdb$relation_id = 0
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = 0e0
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = (1e0 - 1e0)
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = -0e0
-- result = 0
select count(*) from rdb$relations where rdb$relation_id = -(1e0 - 1e0)
-- result = 0
In dialect 1 it could be reproduced without explicit floating point values:
select count(*) from rdb$relations where rdb$relation_id = (1 - 1)
-- result = 1
select count(*) from rdb$relations where rdb$relation_id = -(1 - 1)
-- result = 0
At the same time:
select count(*) from rdb$database where 0e0 = -0e0
-- result = 1, as no index is involved |
Show » |
|
create table t (col double precision primary key);
commit;
insert into t (col) values (0e0);
insert into t (col) values (-0e0);
commit;
select col, count(*) from t group by col;
-- result = {0.000, 2}