Кодирование целых чисел, имеющих символ, можно выполнить 2-мя методами. В первом варианте один (старший) разряд машинном слове отводится для записи знака числа; при всем этом договорились кодировать символ «+» нулем, символ «-» — единицей. Под запись самого числа, разумеется, остается 15 двоичных разрядов, что обеспечивает наибольшее значение числа Zmax = 215 — 1 = 3276710. Такое представление чисел именуется прямым кодом. Но его применение усложняет порядок обработки чисел; к примеру, операция сложения 2-ух чисел с различными знаками должна быть заменена операцией вычитания наименьшего из большего с следующим присвоением результату знака большего по модулю числа. Другими словами, операция сопровождается огромным количеством проверок критерий и выработкой признаков, в согласовании с которыми выбирается то либо другое действие.
Другим вариантом является представление чисел со знаком в дополнительном коде. Мысль построения дополнительного кода довольно ординарна: на оси целых положительных чисел, помещающихся в машинное слово (0 ÷ 65535), сместим положение «О» на середину интервала; числа, попадающие в первую половину (0 ÷ 32767) будем считать положительными, а числа из 2-ой половины (32768 ÷ 65535) — отрицательными. В данном случае судить о знаке числа можно будет по его величине и в очевидном виде выделение знака не будет нужно. К примеру, 1000000000000012 = 3276910 является кодом отрицательного числа, а 0000000000000012 = 110 — кодом положительного. Принадлежность к интервалу кодов положительных либо отрицательных чисел видна по состоянию старшего бита — у кодов положительных чисел его значение «0», отрицательных — «1». Это припоминает представление со знаком, но не является таким, так как употребляется другой принцип кодировки. Его применение позволяет поменять вычитание чисел их суммированием в дополнительном коде. Убедимся в этом чуток позже после того, как обсудим метод построения дополнительного кода целых чисел.
<em>// PascalABC.NET 3.3, сборка 1547 от 07.10.2017</em>
<em>// Внимание! Если программа не работает, обновите версию!</em>
begin
var (a,b,xn,xk,dx):=(2.89,14.34,-50.0,50.0,2.5);
var n:=Trunc((xk-xn)/dx);
var (Max,k,s):=(0.0,0,0.0);
var f:real->real:=x->(a*a+b*Sign(x)*Power(Abs(x),1.0/3))/(3.56+Sin(a+b)+Exp(x));
for var i:=0 to n do begin
var x:=xn+dx*i;
var y:=f(x);
if (i+1) mod 3=0 then Writeln(x:5:1,' ',y);
if y>0 then begin
if y>Max then Max:=y;
s+=y; k+=1
end
end;
Writeln('Max(x,y)=',Max:5:1,' ',f(Max));
Writeln('Среднее значение y равно ',s/k:0:9)
end.
<u>Пример</u>
-45.0 -16.6538893021468
-37.5 -15.4796268651575
-30.0 -14.1362550800162
-22.5 -12.5454529373774
-15.0 -10.5472040721327
-7.5 -7.69691252360641
0.0 2.34531251806799
7.5 0.0201157784771028
15.0 1.33732990416318E-05
22.5 8.26246301436193E-09
30.0 4.95110092030162E-12
37.5 2.91644814868151E-15
45.0 1.69913234739356E-18
Max(x,y)= 2.3 2.10840685577529
Среднее значение y равно 0.212935940
8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160, 168, 176, 184 - секунды, когда башня разваливается
нам нужен период с 121 по 180 секунды. По списку получается 7 раз
Автомат машины Тьюринга в процессе своей работы может выполнять следующие действия:
Записывать символ внешнего алфавита в ячейку (в том числе и пустой), заменяя находившийся в ней (в том числе и пустой).
Передвигаться на одну ячейку влево или вправо.
Менять свое внутреннее состояние.
Одна команда для машины Тьюринга представляет собой конкретную комбинацию этих трех составляющих: указаний, какой символ записать в ячейку (над которой стоит автомат), куда передвинуться и в какое состояние перейти. Хотя команда может содержать и не все составляющие (например, не менять символ, не передвигаться или не менять внутреннего состояния).