У вас не будет значащих цифр, кроме нулей, если вы сделаете это 54 раза. Следовательно, рационализация, которую вы делаете (которая просто сохраняет битовый шаблон), дает то, что вы видели.
InputForm[n53 = Nest[Sqrt, 10., 53]]
Выход[180]//Форма ввода= 1.0000000000000002
InputForm[n54 = Nest[Sqrt, 10., 54]]
Выход[181]//Форма ввода= 1.
Rationalize[n53, 0]
4503599627370497/4503599627370496
Rationalize[n54, 0]
Выход[183]= 1
Для любопытных: проблема не в потере точности в смысле деградации при вычислении итераций. Действительно, повторение этих квадратных корней фактически увеличивает точность. Мы можем увидеть это с помощью ввода bignum.
InputForm[n54 = Nest[Sqrt, 10.`20, 54]]
Out[188]//InputForm= 1.0000000000000001278191493200323453724568038240908339267044`36.25561976585499
Вот собственно проблема. Когда мы используем машинные числа, то после 54 итераций в результирующем машинном двойнике нет значащих цифр, кроме нулей. Другими словами, причиной является наше ограничение размера чисел.
Причина не слишком загадочна. Назовите полученное значение 1+eps. Тогда у нас есть (1 + eps) ^ (2 ^ 54), равный (в близком приближении) 10. Расширение второго порядка показывает, что eps должен быть меньше, чем машинный эпсилон.
InputForm[epsval =
Первый[Выбрать[eps/. N[Solve[Sum[eps^j*Binomial[2^54, j], {j, 2}] == 9, eps]], Head[#] === Real && # > 0 &]]] Out [237]//Форма ввода= 1.864563472253985*^-16
$MachineEpsilon
Выход[235]= 2,22045*10^-16
Даниэль Лихтблау Wolfram Research
person
Daniel Lichtblau
schedule
31.03.2011