gpt4 book ai didi

c++ - 仿真定点除法/乘法

转载 作者:行者123 更新时间:2023-11-30 04:35:42 26 4
gpt4 key购买 nike

我正在编写一个定点类,但遇到了一些问题...乘法、除法部分,我不确定如何模拟。我对部门运算符(operator)进行了非常粗暴的尝试,但我确信这是错误的。到目前为止,它是这样的:

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
};

我...不是一个很好的程序员,哈哈!

该类的 part 是 16 位宽(但表示为 32 位长,因为我想它需要在修复之前为可能的溢出留出空间),同样适用于 value 是整数部分。当“部分”在其中一个操作中超过 0xFFFF 时,最高 16 位被添加到“值”,然后该部分被屏蔽,因此只保留它的最低 16 位。这是在初始化列表中完成的。

我不想问,但如果有人知道我在哪里可以找到此类文档,甚至只是“技巧”或如何执行这两个运算符,我会很高兴!说到数学,我是个笨蛋,我知道以前有人不得不这样做/问过这个问题,但是搜索谷歌一次没有把我带到乐土......

最佳答案

正如 Jan 所说,使用单个整数。由于看起来您正在指定 16 位整数和小数部分,因此您可以使用普通的 32 位整数来执行此操作。

“诀窍”是在对数字进行操作时意识到数字的“格式”会发生什么。您的格式将被描述为 16.16。当您添加或减去时,格式保持不变。当你乘法时,你得到 32.32——所以你需要一个 64 位的临时值作为结果。然后你进行 >>16 移位以得到 48.16 格式,然后取底部 32 位以在 16.16 中得到你的答案。

我对除法有点生疏——在我学习这些东西的 DSP 中,我们尽可能避免(昂贵的)除法!

关于c++ - 仿真定点除法/乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5028986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com