Основная форма ввода для чисел с плавающей точкой? - PullRequest
1 голос
/ 09 февраля 2011

Я только что обнаружил фундаментальное различие между двумя формами ввода для чисел с плавающей запятой:

In[8]:= 1.5*^-334355//Hold//FullForm
1.5*10^-334355//Hold//FullForm
Out[8]//FullForm= Hold[1.5000000000000000000000000000000001`15.954589770191005*^-334355]
Out[9]//FullForm= Hold[Times[1.5`,Power[10,-334355]]]

Эти две формы очень сильно различаются по памяти и потреблению времени:

In[7]:= start = MaxMemoryUsed[];
1.5*^-33432242 // Timing
start = MaxMemoryUsed[] - start
1.5*10^-33432242 // Timing
MaxMemoryUsed[] - start

Out[8]= {1.67401*10^-16, 1.500000000000000*10^-33432242}

Out[9]= 0

Out[10]= {7.741, 1.500000000000000*10^-33432242}

Out[11]= 34274192

Но я не могу узнать, где форма *^ задокументирована.Это реальная базовая форма ввода для чисел с плавающей точкой?Как насчет чисел в других базах?

А почему вторая форма стоит так дорого?

1 Ответ

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

Что касается времени и потребления памяти - это последствия оценки, никак не связанные с разными формами. Вы используете целочисленную арифметику для степени 10, когда 10 присутствует явно, таким образом неэффективность времени / памяти. Когда мы используем точность станка с самого начала, эффект исчезает:

In[1]:= MaxMemoryUsed[]
1.5*^-33432242 // Timing
MaxMemoryUsed[]
1.5*10.^-33432242 // Timing
MaxMemoryUsed[]

Out[1]= 17417696

Out[2]= {0., 1.500000000000000*10^-33432242}

Out[3]= 17417696

Out[4]= {0., 1.500000000043239*10^-33432242}

Out[5]= 17417696

НТН

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...