【发布时间】:2011-02-17 12:35:55
【问题描述】:
我正在编写一个 Fixedpoint 类,但遇到了一些问题……乘法、除法部分,我不知道如何模拟。我对除法运算符进行了非常粗暴的抨击,但我确信这是错误的。到目前为止,它是这样的:
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 位。这是在初始化列表中完成的。
我不想问,但如果有人知道我在哪里可以找到类似这样的文档,甚至只是“技巧”或如何执行这两个运算符,我会非常高兴!在数学方面我是个笨蛋,我知道以前有人必须这样做/问过这个问题,但是搜索谷歌并没有将我带到应许之地...
【问题讨论】:
-
这是作业吗?您实际上是在尝试模仿浮点数学,但不使用浮点字节表示法?你看过 IEEE 是如何处理这个问题的吗?
-
@Zac 遗憾的是,没有,从来没有上过编程学校,或者你可以说什么都没有!这是为了在我正在做的 2d 物理引擎中避免浮点算术的一个非常糟糕的尝试。但我现在正在谷歌搜索 IEEE,所以我会看到的!
-
@Zac:OP 是在谈论“固定”点 mul&division,而不是“浮动”点,这是有区别的。 en.wikipedia.org/wiki/Fixed-point_arithmetic
-
@Tony:两者背后的基本原理是一样的。但是,除非在没有 FPU 的系统上使用它,否则它的效率可能低于仅使用浮点数。
-
@ZacHowland 实际上不是。在具有 FPU 的系统上,简单的整数运算可能仍然比浮点运算更快。此外,可能需要更高的精度而不是更宽的范围。例如,当 24 位单精度有效数有点不足,但对双精度的操作比 32 位 int 长时
标签: c++ bit-manipulation multiplication fixed-point integer-division