Open GoogleCodeExporter opened 9 years ago
[deleted comment]
Hi,
As far as I can tell, the problem also occurs in the Fix16(const fix16_t)
constructor. So Fix16 myInteger(42); yields a fraction instead of a whole
number. There is a solution, but it breaks the semantics of the existing
interface.
- Add a signed and unsigned integer constructor that has whole number semantics
(i.e. treats the value as an integer).
- Remove the Fix16(const fix16_t) constructor, or make it protected and add a
dummy boolean second argument. Maybe making the constructor explicit has the
same effect. That prevents unwanted automatic casts. It should then only be
used to define internal constants, although this does not appear to be
necessary in the current implementation. So removing the constructor altogether
appears preferable.
- Remove all +, -, *, /, +=, -=, *=, and /= operators that do not take a Fix16
argument as rvalue. The compiler will use the constructors to cast/transform
the rvalue, so everything still works. The same applies to the sadd, ssub, smul
and sdiv operations.
- Remove operator fix16_t(). It is dangerous when assigning a Fix16 to an
integer.
- Ideally make the class attribute 'value' protected. Provide a raw() operation
that returns the value if needed.
So yes, these changes affect the existing interface, but that is not
necessarily a bad thing. The current interface leaves a thing or two to be
desired in terms of preventing honest mistakes on the part of the user.
Personally I value preventing such mistakes over maintaining the current
interface.
Original comment by AlexVanD...@gmail.com
on 25 Jul 2011 at 5:12
Original issue reported on code.google.com by
Flatmush@googlemail.com
on 2 Mar 2011 at 1:17