Hello


I posted the message below to the TopBraid users mailing list and already 
clarified that as sh:equals is based on RDF node equality, values such as 
"1.0"^^xsd:float and "1"^^xsd:float count as distinct. So I am keeping this for 
the interest of others in the list



But on SPARQL float comparison I got an advise to check in this mailing list 
for other opinions.

I understand that SPARQL comparison is mathematically based so 1.0 should be 
equal to 1. However below in item 2 you will see the numbers I compared and I 
am getting confused. Take into account that in the data graph the 2 compared 
properties are typed literals with datatype float.

I wanted to know what is the precision when float is compared. So I have 2 
questions

*       What is the precision? - is it 6th decimal and is it OK to compare 
different forms of float, i.e. one is in scientific form
*       Why I am getting wrong comparison result for bigger values such as    
100123456.1     and  100123459     which are found as same



Best regards

Chavdar





========





Dear all,



I have a very basic question...

I need to compare literals that are floats and tried to use two ways. 1) using 
sh:equals to compare 2 properties and 2) using SPARQL where I filter != 
different values



For the filter I tried using

FILTER (xsd:float(?value1)!=xsd:float(?value1)).

or

FILTER (?value1!=?value1).

Both give the same outcome.



Below I listed a summary of the tests I did



I think sh:equals treats the literals as strings even though they are floats. 
It also gives 2 results. I thing this looks like according to the SHACL spec 
although I didn't if the sh:equals ignores the datatype.



However In some cases the result form the SPARQL is kind of strange. It looks 
like the precision is 10-6, but for the big numbers  and when scientific form 
on float number is used we have something different.



What is followed to define the difference?

If I use google calculator

100123456.1-100.123459E+06=-2.90000000596



Normally it should be OK to compare different forms of float.





1) using sh:equals in the property shape

Value1 ; value 2  ; comparisson result

1.123456 ; 1.123456 ; same

1.1234560 ; 1.1234561 ; different (sh:equals reports it twice)

31.1234560 ; 31.1234561 ;different (sh:equals reports it twice)

30    ;      30.0000001 ; different (sh:equals reports it twice)

30     ;      30.000001 ; different (sh:equals reports it twice)

100123456.0  ; 100123456.1 ; different (sh:equals reports it twice)

100123456.0  ; 100123456.0 ; same

100123456    ;  100.123456E6 ; different (sh:equals reports it twice)

100123456    ;  100.123456E+06 ; different (sh:equals reports it twice)

-0.123456789  ;  -123.456789E-3 ; different (sh:equals reports it twice)

-0.123456789  ;  -123.456789E-03 ; different (sh:equals reports it twice)

100123456.1    ;  100.123456E+06  ; different (sh:equals reports it twice)

100123456.1     ;   100.123459E+06 ; different (sh:equals reports it twice)

100123456.1     ;  100123459      ; different (sh:equals reports it twice)

100123456.1     ;  100123459.0    ; different (sh:equals reports it twice)



2) using SPARQL (in the property shape)

1.123456 ; 1.123456 ; same

1.1234560 ; 1.1234561 ; different

31.1234560 ; 31.1234561 ;different

30    ;      30.0000001 ; same

30     ;      30.000001 ; different

100123456.0  ; 100123456.1 ; same

100123456.0  ; 100123456.0 ; same

100123456    ;  100.123456E6 ; same

100123456    ;  100.123456E+06 ; same

-0.123456789  ;  -123.456789E-3 ; same

-0.123456789  ;  -123.456789E-03 ; same

100123456.1    ;  100.123456E+06  ; same

100123456.1     ;   100.123459E+06 ; same

100123456.1     ;  100123459      ; same

100123456.1     ;  100123459.0    ; same



Best regards

Chavdar



Reply via email to