A limit of an attribute: one of the bounds of one of its ranges, or the delta of its
read-different-from-set alarm.
Tango carries these as strings, the type to read them as being the one of the attribute
they belong to, and they are numbers by the time they get here: a limit is something to
compare a value against, which is not something a string does.
They are not all the same number, though. A limit is a value of the attribute itself,
so an attribute of the widest integer kinds has limits a double cannot hold without
rounding them, and the three ways a Tango value is a number are kept apart rather than
all being flattened into one:
a floating attribute, DevFloat or DevDouble, has Self::Double limits;
a signed one, up to DevLong64, has Self::Long limits;
an unsigned one, up to DevULong64, has Self::ULong limits.
A device that writes a limit its own type cannot hold — half a unit on an integer
attribute — still has a limit, and it is read as a Self::Double rather than lost.
Two limits compare as the quantities they stand for, whatever variant each is, so that
Long(2) and Double(2.0) are equal: two integers are compared exactly, the widest
ones included, and anything else as doubles, a not-a-number being equal to nothing and
ordered with nothing.
This limit as a double, which is what comparing it against a value of any other
kind goes through, the widest integers losing their last digits the way they do in
any other conversion to a double.