eclipse-leshan / leshan

Java Library for LWM2M
https://www.eclipse.org/leshan/
BSD 3-Clause "New" or "Revised" License
647 stars 407 forks source link

Question about type of numeric LWM2M attributes. #1583

Open sbernard31 opened 7 months ago

sbernard31 commented 7 months ago

The specification v1.1.1 defines greater than, lesser than and step as decimal :

But there is (or at least I find nothing) which clearly define limit for this decimal. E.g. nothing says that this decimal should be representable as IEEE double-precision, floating-point numbers [IEEE.754].

Currently, in Leshan we encode decimal attribute as java double but that means that some decimal number can not be used. (classic precision number issue with floating point number)

When greater than, lesser than and step is used to target :

So question is :

sbernard31 commented 7 months ago

@PFnord, @mgdlkundera, @jvermillard, @JaroslawLegierski any opinion about it ?

jvermillard commented 7 months ago

Is there a way where, if the number is received as an integer, to store it and use it as an integer, and if it's a float number, decode it as double? I think if you try to use only double for those parameters you will have errors in strict equality with a lot of integer values

PFnord commented 7 months ago

As I understand it those attributes are "Float" explained in an older spec (2018_OMA_SPEC in Data Types appendix):

Represented as a binary floating point value [IEEE 754-2008] [FLOAT]. The value may use the binary32 (4 byte length) or binary64 (8 byte length) format as indicated by the Length field. When transmitted over network, the data is represented in network byte order (big endian)

I would assume, treating a float attribute as double seems ok to me.

Spec specify we can have 64bit integers resources, which I would assume means we can have 64 bit integer attributes (or close to it). I would agree with @jvermillard and treat them as integer/long when possible?

sbernard31 commented 7 months ago

As I understand it those attributes are "Float" explained in an older spec (2018_OMA_SPEC in Data Types appendix):

I understand the data type appendix is about LWM2M Resource typing, I don't think this is about attributes typing.

Spec specify we can have 64bit integers resources, which I would assume means we can have 64 bit integer attributes (or close to it).

During comparison this should be OK but as I said if someone send me a st=9223372036854775807, it will be converted in 9223372036854776000. In that case we can eventually raise an error or log a warning or change the code to support it.

Is there a way where, if the number is received as an integer, to store it and use it as an integer, and if it's a float number, decode it as double?

Not really, currently the attribute is strongly typed. We can eventually change the type to :

sbernard31 commented 1 week ago

I created a PR about using BigDecimal instead of Double : #1647