Leg*_*ser -1 c++ floating-point fixed-point
我搜索了半天,发现了一些非常有趣的事情,关于在C++中使用定点数据类型和位移来完成除法运算,同时避免浮点数学运算.但是,我只能理解它的一小部分,我似乎无法得到任何工作.
我想要做的就是取两个整数,加上它们,除以2得到平均值.我需要能够非常快速地做到这一点,因为我在Arduino上插入相机像素数据,我还有其他操作要做.
所以我对一般的转变感到困惑.假设我想要除以2的整数是27. 27的一半是13.5.但无论我尝试什么定点数据类型,我只能得到13作为输出.例如:
uint8_t x = 27;
Serial.println( x >> 1 );
Run Code Online (Sandbox Code Playgroud)
返回13
必须有一些简单的方法来做到这一点,对吧?
固定点确实为您提供了表示13.5的方法.有关Q号格式的维基百科文章内容丰富:https://en.wikipedia.org/wiki/Q_(number_format)
可以这样想:你继续使用整数,但不是将它们视为面值,而是将它们全部隐含地除以2的幂来获得它们的语义值.
因此,如果使用无符号字节作为基本类型(0到255之间的值,包括0和255之间的值),则可能隐含地除以2**3(8).现在要表示27,你需要一个设置为27*8 => 216的整数.除以2,你将一个向右移; 现在你的整数是108,除以8的隐式分母得到13.5,这是你期望的值.
您必须意识到定点数系统(以及浮点数,尽管它不那么明显)仍然有限制,当然; 无论你做什么,某些操作都会溢出,有些操作会导致精度损失.这是使用有限大小类型的正常结果.