Gen_X 发表于 2024-8-13 19:46

3个数字取中函数

本帖最后由 Gen_X 于 2024-8-13 19:47 编辑

<p>如图,看到很多关于3个数取中的程序,感觉都有点复杂,不满足本人简单复制黏贴的需要,</p>

<p>所以整理了一个看上去最简明的函数,默认int ,不分类型,直接定义如下:</p>

<p>#define mid3v(a,b,c) (a&gt;b? (a&lt;c? a:(a&gt;c? b:c)):(b&lt;c? b:(b&gt;c? a:c)))</p>

<p>将需要取中的三个值分别付给a、b、c,</p>

<p>调用时只需&nbsp; &nbsp;Ymid = mid3v(a,b,c)即可。</p>

<p>关键是只有一行代码,便于复制黏贴,</p>

<p>常用于简单快速采样3次取中,然后再加上简单的LAG惯性滤波,即可消除大部分的随机干扰。</p>

<p>&nbsp;</p>

<p>注意:a + b = 1 。LAG计算如下:</p>

<p>Yout = a*x + b*Y0 ;</p>

<p>Y0 = Yout ;</p>

<p>end;</p>

wangerxian 发表于 2024-8-14 09:16

<p>用宏定义实现,是不是会比函数实现效率高一些?</p>

秦天qintian0303 发表于 2024-8-14 09:32

<p>那要是是一个取中呢?其实主要还是数少,基本上都得来一遍遍历</p>

Gen_X 发表于 2024-8-14 14:15

本帖最后由 Gen_X 于 2024-8-15 08:55 编辑

<p>我说的仅仅是3个数的取中。多于三个的就不是这个函数!</p>

<p>关键是只有三个,做个很大的函数,使用不变。</p>

Gen_X 发表于 2024-8-14 14:29

本帖最后由 Gen_X 于 2024-8-15 08:56 编辑

<p>仅仅是个人使用经验的分享,类似的函数还有:</p>

<p>限幅函数</p>

<p>#define Limit(x, min, max) (x)=(((x)&lt;=(min))?(min):(((x)&gt;=(max))?(max):(x)))</p>

<p>最大值</p>

<p>#define max3v(v1, v2, v3) ((v1)&lt;(v2)? ((v2)&lt;(v3)?(v3):(v2)):((v1)&lt;(v3)?(v3):(v1)))</p>

<p>最小值</p>

<p>#define min3v(v1, v2, v3) ((v1)&gt;(v2)? ((v2)&gt;(v3)?(v3):(v2)):((v1)&gt;(v3)?(v3):(v1)))</p>

<p>个人感觉使用非常方便,甚至都是抄来的,也感谢那些无私&ldquo;开源&rdquo;的高手。</p>

<p>给你们点赞!</p>

Gen_X 发表于 2024-8-14 14:34

<p>这个分享的意义仅在于:</p>

<p>复制&mdash;&mdash;粘贴&mdash;&mdash;使用,小巧方便、不需要定义变量。</p>

Gen_X 发表于 2024-8-15 08:59

wangerxian 发表于 2024-8-14 09:16
用宏定义实现,是不是会比函数实现效率高一些?

<p>我感觉宏定义也省略了数据类型的定义,使用更灵活。</p>

wangerxian 发表于 2024-8-15 14:45

Gen_X 发表于 2024-8-15 08:59
我感觉宏定义也省略了数据类型的定义,使用更灵活。

<p>确实也是,不用定义数据类型。</p>

hellokitty_bean 发表于 2024-8-15 20:02

<p>哈哈哈。。。。小技巧,使用起来方便就好。。。。。。随便怎样都行</p>

freebsder 发表于 2024-8-15 20:16

<p>其实没必要写这么紧凑吧,内部还是会换成if else。</p>
页: [1]
查看完整版本: 3个数字取中函数