[ 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)

原文地址:https://www.cnblogs.com/yeungchie/p/13849255.html