Внутренние числовые форматы Mathematica и точность

106
10

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


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 внутренне держит его в цифрах, но кто-нибудь знает или заботится о том, чтобы опасно понять, как?

спросил(а) 2021-01-19T18:27:16+03:00 2 месяца, 3 недели назад
1
Решение
130

Если я правильно понимаю, вам интересно, когда 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 (что аналог bignum для машины плавает в Mathematica).


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


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

ответил(а) 2021-01-19T18:27:16+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема