очень странный вопрос по математике

Я делаю это в mma v7.0:

r[x_] := Rationalize[x, 0]; N[Nest[Sqrt, 10., 53] // r, 500]

Это дало мне 1.000000000000000222044604925031308084726333618164062500000000000000000

Однако, если я сделаю еще один шаг вперед N[Nest[Sqrt, 10., 54] // r, 500]

У меня все нули. Кто-нибудь знает объяснение, или это ошибка?

Кроме того, похоже, что этот способ получения большего количества цифр из решения Nest[Sqrt, 10., 53] работает не очень хорошо. Как получить более значащие цифры для этого расчета?

Большое спасибо.

Изменить

Если бы я сделал Nest[Sqrt, 10., 50], я все равно получил бы много значащих цифр.


person Qiang Li    schedule 30.03.2011    source источник


Ответы (2)


InputForm /@ NestList[Sqrt, 10., 54]

10.
3.1622776601683795
1.7782794100389228
1.333521432163324
1.1547819846894583
1.0746078283213176
1.036632928437698
1.018151721718182
1.0090350448414476
1.0045073642544626
1.002251148292913
1.00112494139988
1.0005623126022087
1.00028111678778
1.0001405485169472
1.0000702717894114
1.000035135277462
1.0000175674844227
1.0000087837036347
1.0000043918421733
1.0000021959186756
1.000001097958735
1.0000005489792168
1.0000002744895706
1.000000137244776
1.0000000686223856
1.000000034311192
1.0000000171555958
1.0000000085777978
1.0000000042888988
1.0000000021444493
1.0000000010722245
1.0000000005361123
1.0000000002680562
1.0000000001340281
1.000000000067014
1.000000000033507
1.0000000000167535
1.0000000000083769
1.0000000000041884
1.0000000000020943
1.0000000000010472
1.0000000000005236
1.0000000000002618
1.000000000000131
1.0000000000000655
1.0000000000000329
1.0000000000000164
1.0000000000000082
1.000000000000004
1.000000000000002
1.0000000000000009
1.0000000000000004
1.0000000000000002
1.

Бросать N[x, 500] на это все равно, что пытаться выжать воду из камня.


Расчеты выше выполняются с машинной точностью, что очень быстро. Если вы готовы отказаться от скорости, вы можете использовать арифметику Mathematica с произвольной точностью: указание немашинной точности для входных значений. Для этого можно использовать «обратную галочку» (как в примере ниже) или использовать SetPrecision или SetAccuracy. Здесь я укажу, что вводом является число от 10 до 20 цифр точности.

NestList[Sqrt, 10`20, 54]

10.000000000000000000
3.1622776601683793320
1.77827941003892280123
.
.
.
1.00000000000000051127659728012947952
1.00000000000000025563829864006470708
1.000000000000000127819149320032345372

Как видите, вам не нужно использовать InputForm, так как Mathematica будет автоматически печатать числа произвольной точности в максимально возможном количестве мест.

Если вы используете InputForm или FullForm, вы увидите обратную кавычку, а затем число, которое является текущей точностью этого числа.

person Mr.Wizard    schedule 30.03.2011
comment
Волшебник: +1, вы знаете способ получить еще больше цифр, чем InputForm? Спасибо. - person Qiang Li; 31.03.2011
comment
@Qiang Li да, вы можете запустить механизм произвольной точности, указав немашинную точность для входных чисел. Я отредактирую, чтобы привести пример. - person Mr.Wizard; 31.03.2011
comment
Волшебник, я вижу. Забыл, что я мог использовать ```. :) Что касается моего первоначального вопроса, я все еще озадачен тем, почему ответ был неверным после многократного применения функции Sqrt. Может быть, это было из-за функции Rationalize? Я не могу пока принять ваш ответ, хотя вы решаете мой вопрос в другом направлении. Большое спасибо. - person Qiang Li; 31.03.2011
comment
@ Цян Ли, какого ответа ты ожидаешь? I Рациональное значение 1. равно просто 1, точному значению. Запрашивать 500 цифр единицы — это просто единица, за которой следуют 499 нулей. Возможно, я не понимаю вопроса. - person Mr.Wizard; 31.03.2011
comment
Волшебник, ладно, я думаю, проблема связана с аппроксимацией в Rationalize. - person Qiang Li; 31.03.2011

У вас не будет значащих цифр, кроме нулей, если вы сделаете это 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