[ Skill ] 对一个 list 中的元素去重 ( artUnique 改进版本 )

https://www.cnblogs.com/yeungchie/

替代内置函数 artUnique ,解决浮点数运算误差造成的去重不彻底。
具体的原因可以看这里 为什么浮点运算有误差?

  • code
;-----------------------------
;  Program   :  ycUnique.il
;  Language  :  Cadence Skill
;  Author    :  YEUNGCHIE
;  Version   :  2020.10.20
;-----------------------------
procedure(ycUnique(dbList @optional eps(1e-10) "ln")
    prog((uniqueList)
        foreach(x dbList
            prog((numbers delta)
                unless(member(x uniqueList)
                    when(numberp(x)
                        numbers = setof(v uniqueList numberp(v))
                        when(numbers
                            foreach(num numbers
                                delta = abs(num - x)
                                when(delta < eps || delta - eps < 1e-10
                                    return()
                                )
                            )
                        )
                    )
                    uniqueList = append1(uniqueList x)
                )
            );prog
        )
        return(uniqueList)
    );prog
);ycUnique
  • describe

    dbList 为输入 list

    eps 为输入数字,指定判定精度,默认值为 \(1e^{-10}\)

  • example

;bad case
artUnique(list(4.0 1.2/(0.1+0.2)))

ycUnique(list(4.0 1.2/(0.1+0.2)))

ycUnique(list(1 2 3 5 7 8 9) 2)

posted @ 2020-10-20 21:44  YEUNGCHIE  阅读(1142)  评论(1编辑  收藏  举报