Я пишу класс с фиксированной точкой, но столкнулся с небольшой загвоздкой... Умножение, деление частей, я не уверен, как эмулировать. Я нанес очень грубый удар оператору подразделения, но я уверен, что это неправильно. Вот как это выглядит на данный момент:
class Fixed
{
Fixed(short int _value, short int _part) :
value(long(_value + (_part >> 8))), part(long(_part & 0x0000FFFF)) {};
...
inline Fixed operator -() const // example of some of the bitwise it's doing
{
return Fixed(-value - 1, (~part)&0x0000FFFF);
};
...
inline Fixed operator / (const Fixed & arg) const // example of how I'm probably doing it wrong
{
long int tempInt = value<<8 | part;
long int tempPart = tempInt;
tempInt /= arg.value<<8 | arg.part;
tempPart %= arg.value<<8 | arg.part;
return Fixed(tempInt, tempPart);
};
long int value, part; // members
};
Я... не очень хороший программист, ха-ха!
«Часть» класса имеет ширину 16 бит (но выражается как длинная 32-битная, поскольку я полагаю, что ей потребуется место для возможных переполнений, прежде чем они будут исправлены), и то же самое касается «значения», которое является целочисленной частью. Когда «часть» превышает 0xFFFF в одной из своих операций, старшие 16 бит добавляются к «значению», а затем часть маскируется, поэтому остаются только младшие 16 бит. Это делается в списке инициализации.
Я ненавижу спрашивать, но если бы кто-нибудь знал, где я могу найти документацию для чего-то подобного, или даже просто «трюка» или как сделать эти два оператора, я был бы очень рад за это! Я тупица, когда дело доходит до математики, и я знаю, что кому-то приходилось делать/спрашивать об этом раньше, но поиск в Google на этот раз не привел меня в землю обетованную...