在準備對Count how many different values a list takes in Mathematica的回答時,我發現DeleteDuplicates
和Tally
中存在不穩定(因爲缺乏更好的術語),我不明白。DeleteDuplicates和Tally中的不穩定
首先考慮:
a = {2.2000000000000005, 2.2, 2.1999999999999999};
a // InputForm
[email protected] // InputForm
[email protected] // InputForm
[email protected] // 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
[email protected] // InputForm
[email protected] // InputForm
[email protected] // 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
和的結果令人驚訝。
爲什麼
DeleteDuplicates
突然看到2.1999999999999997
爲重複被淘汰?爲什麼
Tally
突然看到2.2000000000000006
和2.2
是不同的,當它不在之前?
作爲相關點,可以看出,堆積陣列影響Tally
:
a = {2.2000000000000005, 2.2, 2.1999999999999999};
a // InputForm
[email protected] // InputForm
{2.2000000000000006, 2.2, 2.1999999999999997}
{{2.2000000000000006`, 3}}
a = Developer`[email protected];
a // InputForm
[email protected] // InputForm
{2.2000000000000006, 2.2, 2.1999999999999997}
{{2.2000000000000006`, 1}, {2.2, 2}}
感謝您的分析。 – 2011-05-29 19:47:10
+1 - 非常好的討論,謝謝!從實際的角度來看,我仍然認爲'Equal'將處理比'SameQ'更令人滿意的更多情況。一個更好定義的問題將是基於一些剛性網格(一組箱)定義等價類,並且如果兩個數字最終在同一個「箱」中,則認爲兩個數相等。這是臨時的,但是定義明確的,對許多問題來說可能並不合理。 – 2011-05-29 20:33:31
@Leonid和WReach,是'Order [#,#2] === 0&SameQ-And-I-Real-It-This-This-Time的最佳選擇嗎? – 2011-05-30 09:09:53