# User-defined assignment is ignored in large Table[ ] computation

Posted 9 months ago
1215 Views
|
3 Replies
|
0 Total Likes
|
 I observed a strange behavior when I create a definition for a build-in function like Abs[]. If I use them e.g. in Table, the user definition is ignored when the table becomes large. Here is the example to illustrate this phenomena: Unprotect[Abs] Abs[x_] := x^2 Small table: Table[Abs[i], {i, 30}]  {1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900} Larger table: Table[Abs[i], {i, 300}]  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, <<277>>, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300} I use Mathematica 10.0.2 (x64) on Windows 10
3 Replies
Sort By:
Posted 9 months ago
 Hi MartinCompare Table[Abs[i], {i, 249}] // Trace Table[Abs[i], {i, 250}] // Trace When the upper bound exceeds 249 Table probably uses a version of Abs that is internal and optimized for long lists.Lesson: Modifying built-in functions is risky and unpredictable.What problem are you trying to solve? Perhaps there is a better solution for it rather than this example.
Posted 9 months ago
 Thanks for your reply. There is no real problem to be solved, I just want to understand the internals of Mathematica.So, overwriting a function do not guarantee the replacement at all kind of situations.What about using UpSetDelayed? Abs[f[x_]] ^:= x^2 Table[Abs[f[i]], {i, 30}] 
Posted 9 months ago
 That is certainly a much safer operation because the definition is associated with f, not Abs. For more details take a look at this and this.