不久前,我创建了一堆用于定点值操作的C宏.在SO的几个问题和答案的鼓励下,我希望在我的计划的计算密集部分中获得性能提升.虽然代码似乎产生了正确的结果,但我想知道它是不是太天真/过于简单,因为它实际上比我的例程的常规浮点版本运行得慢(我在Wintel上进行双三次图像插值).您能否看一下包含我的宏的这段代码,并提出一些改进建议,特别是在性能方面?谢谢.
// these are architecture-dependent
typedef short int fixed16;
typedef int fixed32;
typedef __int64 fixed64;
// value of 2^n
#define POW2(n) (1 << n)
// create 16bit integer-based fixed point value from a floating point value, n is the number of bits reserved for the fractional part
#define FP_MAKE16(x, n) ((x) > 0.0 ? static_cast<fixed16>(floor((x) * POW2(n) + 0.5)) : static_cast<fixed16>(ceil((x) * POW2(n) - 0.5)))
// the same, 32bit
#define FP_MAKE32(x, n) ((x) > 0.0 ? static_cast<fixed32>(floor((x) * POW2(n) + …我发现很难理解定点表示。当我有无符号类型的数据 (C++) 并且我想使用该数字时,就好像它是定点一样,我需要做一些我不清楚的位操作。
因此,假设我希望我的无符号数字最大为 255(8 位数字)以 U4.4 或 U12.8 或 S13.8 或任何符号表示(U - 无符号,S - 有符号,它来当我的号码是 int 时有问题)。基本上我正在扩大(或者我希望我是)数字,处理它,然后将其返回到以前的状态。
我怎么做?
有人可以分享链接,我可以在其中找到与此主题密切相关的内容。我找了三个小时,我发现的只是关于定点算术的一般解释,没有什么非常实用的。
谢谢
在我的Java应用程序中,我需要解释32位不动点值.数字格式如下:前15位描述逗号/点之前的位置,第16位表示值的符号,后面的16位描述小数位(1/2,1/4,1/8) 1/16,...).
输入是一个包含四个值的字节数组.字节数组中位的顺序是小端.
我怎样才能将这样的数字转换成Java float?
我试图在 Swift 中准确地表示浮点数。假设我们有一个 number let doubleNumber = 16.756。问题在于实际数字类似于16.7560009. 此外,在不同的手机上16.7559991,例如,由于处理器不平等。定点算术应该是这类问题的答案,但我不知道如何在 Swift 中解决它。老实说,在其他语言中也没有。那么如何在 Swift 中创建浮点数的定点表示呢?
我问的原因是,在跨设备准确模拟物理时,浮点数值的微小差异会导致完全不同的物理模拟。
如何使用 exp2() 的极小极大多项式近似来实现 2^x 定点算术 s5.26 并且输入值在 [-31.9, 31.9] 范围内 如何使用以下链接中提到的 Sollya 工具生成多项式 Power of 2 定点逼近
我正在寻找函数的有效实现pow(a, b),其中a仅限于区间(0,1),并且b是>= 1(两者都是实数 - 即不一定是整数)。
如果有帮助, b这不是一个很高的数字——假设它小于 10-20。这将打开迭代解决这个问题的可能性,迭代次数很少~=b
代码应该在 32 位微控制器上工作,可能没有浮点单元(即,使用定点实现)。
我如何实现这样一个功能,针对以下约束进行优化?我正在寻找算法本身,所以伪代码是可以接受的。
我是 Assembly 的新手,正在学习定点算法。
AX 是一个 16 位寄存器-
 MUL Pi  ; Multiplies EAX with Pi and stores result in EAX
 DIV 256 ; Divides EAX by 256 which equals the necessary right- shift for the 8,8 format
但我不认为它是这样工作的。
我正在实现 32 位有符号整数定点算术。范围是从1到-1,INT32_MAX对应于1。我不确定是否要制作INT32_MIN或-INT32_MAX对应于-1,但这暂时放在一边。
我做了一些乘法和舍入操作,如下所示:
#define mul(a, b) ((int64_t)(a) * (b))
#define round(x) (int32_t)((x + (1 << 30)) >> 31)
然后可以使用 找到两个数字的乘积round(mul(a, b))。
当我检查身份时,问题就出现了。主要问题是 1x1 不是 1。它是INT32_MAX-1。这显然是不希望的,因为我想要位精度。我想这会影响其他附近的数字,因此如果操作数都是 ,则修复不是仅加 1 的情况INT32_MAX。另外,-1x-1 不是-1,1x-1 不是-1,并且-1x-1=-1。所以这些身份都站不住脚。
是否有一个简单的解决方案,或者这只是使用定点算术的症状?
我正在寻找一种算法来乘以和除以15.16的固定点数.
我已经有加法和减法.那些很简单 - 简单的32位加法和减法.通过乘法和除法,我还可以添加许多三角函数和指数/日志函数.而且我认为我可以处理多次,因为我的库有一个互惠函数,我可以用它来实现除法:a * (1/b) = a / b.但是32位乘法不起作用,因为它忽略了小数点.
我正在研究一个16位微控制器,所以我想避免超过32位乘法,这在我的处理器上需要大约4个周期.但这并不重要,我只是想替换浮点数学.
我听说我需要移动或旋转结果,但我不确定这将如何帮助或具体如何改变它.任何建议或帮助表示赞赏!
我想将 ax 寄存器中的无符号 8.8 定点数与 1.00125 相乘和相除,并将结果也存储在 ax 中。
我知道定点乘法/除法需要一些额外的步骤,但我不知道如何在汇编中实现这些步骤。
非常感谢您的帮助。
我搜索了半天,发现了一些非常有趣的事情,关于在C++中使用定点数据类型和位移来完成除法运算,同时避免浮点数学运算.但是,我只能理解它的一小部分,我似乎无法得到任何工作.
我想要做的就是取两个整数,加上它们,除以2得到平均值.我需要能够非常快速地做到这一点,因为我在Arduino上插入相机像素数据,我还有其他操作要做.
所以我对一般的转变感到困惑.假设我想要除以2的整数是27. 27的一半是13.5.但无论我尝试什么定点数据类型,我只能得到13作为输出.例如:
uint8_t  x = 27;
Serial.println(  x >> 1 );
返回13
必须有一些简单的方法来做到这一点,对吧?