[ 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
为输入 listeps
为输入数字,指定判定精度,默认值为 \(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)