【发布时间】:2011-05-29 09:22:19
【问题描述】:
在准备对Count how many different values a list takes in Mathematica 的答复时,我在DeleteDuplicates 和Tally 中遇到了我不理解的不稳定(因为没有更好的术语)。
先考虑:
a = {2.2000000000000005, 2.2, 2.1999999999999999};
a // InputForm
DeleteDuplicates@a // InputForm
Union@a // InputForm
Tally@a // InputForm
{2.2000000000000006`, 2.2, 2.1999999999999997`}
{2.2000000000000006`, 2.2, 2.1999999999999997`}
{2.1999999999999997`, 2.2, 2.2000000000000006`}
{{2.2000000000000006`, 3}}
这种行为在每种情况下都符合我的预期。 Tally 补偿了细微的数值差异,并将每个元素视为等效。 Union 和 DeleteDuplicates 认为所有元素都是独一无二的。 (Tally 的这种行为据我所知没有记录,但我以前使用过。)
现在,考虑一下这个并发症:
a = {11/5, 2.2000000000000005, 2.2, 2.1999999999999997};
a // InputForm
DeleteDuplicates@a // InputForm
Union@a // InputForm
Tally@a // InputForm
{11/5, 2.2000000000000006, 2.2, 2.1999999999999997}
{11/5, 2.2000000000000006, 2.2}
{2.1999999999999997, 2.2, 11/5, 2.2000000000000006}
{{11/5, 1}, {2.2000000000000006, 1}, {2.2, 2}}
Union 的输出符合预期,但DeleteDuplicates 和Tally 的结果令人惊讶。
为什么
DeleteDuplicates突然把2.1999999999999997看作是重复的要被淘汰?为什么
Tally突然将2.2000000000000006和2.2区别开来,而以前却没有?
作为相关点,可以看出打包数组会影响Tally:
a = {2.2000000000000005, 2.2, 2.1999999999999999};
a // InputForm
Tally@a // InputForm
{2.2000000000000006, 2.2, 2.1999999999999997}
{{2.2000000000000006`, 3}}
a = Developer`ToPackedArray@a;
a // InputForm
Tally@a // InputForm
{2.2000000000000006, 2.2, 2.1999999999999997}
{{2.2000000000000006`, 1}, {2.2, 2}}
【问题讨论】:
标签: wolfram-mathematica duplicates precision