Почему точность в Mathematica не работает последовательно, а иногда и вовсе не работает? - PullRequest
0 голосов
/ 15 мая 2019

Рассмотрим следующие завершающие десятичные числа.

3.1 ^ 2 = 9,61

3,1 ^ 4 = 92,3521

3,1 ^ 8 = 8528,91037441

ниже показано, как Mathematica обрабатывает эти выражения

 In[1]:= 3.1^2
 Out[1]= 9.61

 In[2]:= 3.1^4
 Out[2]= 92.352

Пока все хорошо, но

 In[3]:= 3.1^8
Out[3]= 8528.91

не обеспечивает достаточной точности.

Итак, давайте попробуем N [], NumberForm [] и DecimalForm [] с точностью 12

 In[4]:= N[3.1^8,12]
Out[4]= 8528.91

 In[5]:= NumberForm[3.1^8,12]
Out[5]= 8528.91037441

 In[6]:= DecimalForm[3.1^8,12]
Out[6]= 8528.91037441

В этом случае DecimialForm [] и NumberForm [] работают как положено, ноN [] обеспечивало точность по умолчанию, равную 6, даже несмотря на то, что я попросил 12. Так что DecimalForm [] или NumberForm [] кажутся подходящими, если вы хотите получить точные результаты, когда входные значения заканчиваются десятичными дробями.

Далее рассмотрим рациональные числа с бесконечными повторяющимися десятичными числами, такими как 1/3.

 In[7]:= N[1/3,20]
Out[7]= 0.33333333333333333333

 In[9]:= NumberForm[1/3, 20]
Out[9]=
     1/3

 In[9]:= DecimalForm[1/3, 20]
Out[9]=
     1/3

В отличие от предыдущего случая, N [], кажется, является правильным путем, в то время как NumberForm [] и DecimalForm [] делаютне соблюдайте точность.

Наконец, рассмотрим иррациональные числа, такие как Sqrt [2] и Pi.

 In[10]:=  N[Sqrt[2],20]
Out[10]=   1.4142135623730950488

 In[11]:= NumberForm[Sqrt[2], 20]
 Out[11]= 
        sqrt(2)

 In[12]:= DecimalForm[Sqrt[2], 20]
 Out[12]= 
        sqrt(2)

   In[13]:=  N[π^12,30]
  Out[13]=  924269.181523374186222579170358

   In[14]:= NumberForm[Pi^12,30]
  Out[14]= 
      π^12

   In[15]:= DecimalForm[Pi^12,30]
  Out[15]= 
      π^12

В этих случаях N [] работает, а NumberForm [] и DecimalForm [] - нет.Тем не менее, обратите внимание, что N [] переключается на научное обозначение при π ^ 13, даже с большей точностью.Есть ли способ избежать этого переключения?

    In[16]:=  N[π^13,40]
   Out[16]=  2.903677270613283404988596199487803130470*10^6

Так что, похоже, нет единого способа сформулировать, как получить десятичные числа с требуемой точностью и в то же время избежать научной нотации.Иногда работает N [], иногда работает DecimalForm [] или NumberForm [], а иногда кажется, что ничего не работает.

Я что-то пропустил или есть ошибки в системе?

1 Ответ

1 голос
/ 15 мая 2019

Это не ошибка, потому что он разработан специально для такого поведения. Точность ограничена точностью вашей машины, вашей конфигурацией Mathematica, а также алгоритмом и ограничениями производительности расчета.

Документация для N[expr, n] гласит: attempts to give a result with n‐digit precision. Когда он не может дать запрошенную точность, он подходит как можно ближе. DecimalForm и NumberForm работают одинаково.

https://reference.wolfram.com/language/ref/N.html объясняет различные случаи, стоящие за этим:

  • Если числа в expr не являются точными или имеют достаточно высокую точность, N[expr,n] может не дать результатов с n -разрядной точностью.
  • N[expr,n] может выполнять вычисления с точностью до n цифр. $MaxExtraPrecision указывает максимальное количество дополнительных цифр точности, которые когда-либо будут использоваться внутри.
  • Точность n указана в десятичных разрядах; оно не должно быть целым числом.
  • n должно лежать между $MinPrecision и $MaxPrecision. $MaxPrecision можно установить на Infinity.
  • n может быть меньше $MachinePrecision.
  • N[expr] дает число точности станка, при условии, что его величина находится между $MinMachineNumber и $MaxMachineNumber.
  • N[expr] эквивалентно N[expr,MachinePrecision].
  • N[0] дает число 0. С точностью станка.
  • N преобразует все ненулевые числа в форму Real или Complex.
  • N преобразует каждый последующий аргумент любой встречаемой функции в числовую форму, если только заголовок функции не имеет атрибута, такого как NHoldAll.
  • Вы можете определить числовые значения функций, используя N[f[args]]:=value и N[f[args],n]:=value.
  • N[expr,{p,a}] пытается получить результат с точностью не более p и точностью не более a.
  • N[expr,{Infinity,a}] пытается получить результат с точностью a.
  • N[expr,{Infinity,1}] пытается найти числовое приближение к целочисленной части expr.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...