Mathematica внутренние форматы чисел и точность - PullRequest
5 голосов
/ 09 февраля 2011

Тангенциально связан с этим вопросом, что именно здесь происходит с форматированием чисел?

In[1]  := InputForm @ 3.12987*10^-270
Out[1] := 3.12987`*^-270

In[2]  := InputForm @ 3.12987*10^-271
Out[2] := 3.1298700000000003`*^-271

Если вы используете *10.^ в качестве множителя, переход будет таким, каким вы были бы наивноожидайте, что это будет:

In[3]  := InputForm @ 3.12987*10.^-16
Out[3] := 3.12987`*^-16

In[4]  := InputForm @ 3.12987*10.^-17
Out[4] := 3.1298700000000004`*^-17

, тогда как *^ продвигает переход немного дальше, хотя и начинает ослабевать точность станка:

In[5]  := InputForm @ 3.12987*^-308
Out[5] := 3.12987`*^-308

In[6]  := InputForm @ 3.12987*10.^-309
Out[6] := 3.12987`15.954589770191008*^-309

База начинает разрушатьсятолько намного позже

In[7]  := InputForm @ 3.12987*^-595
Out[7] := 3.12987`15.954589770191005*^-595

In[8]  := InputForm @ 3.12987*^-596
Out[8] := 3.1298699999999999999999999999999999999999`15.954589770191005*^-596

Я предполагаю, что эти переходы относятся к формату, в котором Mathematica хранит свои цифры внутри, но кто-нибудь знает или хочет рискнуть образованным предположением, как?

1 Ответ

8 голосов
/ 09 февраля 2011

Если я правильно понимаю, вы задаетесь вопросом, когда InputForm будет отображать более 6 цифр. Если это так, то это происходит случайно, когда требуется больше цифр, чтобы «лучше» представить число, полученное после оценки. Поскольку оценка включает в себя явное умножение на 10 ^ (некоторая степень), и поскольку десятичный ввод не должен быть (а в данном случае нет) точным представлением в двоичном коде, вы можете получить небольшие отличия от ожидаемого.

In[26]:= Table[3.12987*10^-j, {j, 10, 25}] // InputForm

Out[26]//InputForm=
{3.12987*^-10,
 3.12987*^-11, 
 3.12987*^-12, 
 3.12987*^-13, 
 3.12987*^-14, 
 3.12987*^-15, 
 3.12987*^-16, 
 3.1298700000000004*^-17, 
 3.1298700000000002*^-18, 
 3.12987*^-19, 
 3.12987*^-20, 
 3.1298699999999995*^-21, 
 3.1298700000000003*^-22, 
 3.1298700000000004*^-23, 
 3.1298700000000002*^-24, 
 3.1298699999999995*^-25}

Что касается входного синтаксиса * ^, это фактически синтаксическая (фактически лексическая) конструкция. Никакая точная мощность 10 не вычисляется. Создается значение с плавающей запятой, и оно максимально точно в той степени, в которой допускается двоично-десятичное, для вашего ввода. InputForm покажет столько цифр, сколько было использовано при вводе числа, потому что это действительно ближайший десятичный знак к соответствующему двоичному значению, которое было создано.

Когда вы преодолеваете ограничения чисел с плавающей запятой, вы получаете аналог произвольной точности. Это уже не machinePrecision, а фактически $ MachinePrecision (это аналог bignum для машинных операций в Mathematica).

То, что вы видите в InputForm для 3.12987 * ^ - 596 (десятичное число, заканчивающееся серией 9), я полагаю, вызвано внутренним представлением Mathematica, включающим использование защитных битов. Если бы было только 53 бита мантиссы, аналогично машинному двойнику, то ближайшим десятичным представлением были бы ожидаемые шесть цифр.

Даниэль Лихтблау Wolfram Research

...