| Общие вопросы по математике | |
| Как возвести (-1) в степень N? | |
| Является ли число степенью двойки? | |
| Двоичные числа, заданные строками: вычитание / перемножение | |
| Как вычислить арксинус / арккосинус аргумента? | |
| Разложение функции в ряд: Ln(x) / Exp(x) | |
Как возвести (-1) в степень N?
function minusOnePower(n: integer): integer; begin minusOnePower := (1 - 2*byte(Odd(n))); end;
Является ли число степенью двойки?
function is_power_2(x: word): boolean; begin is_power_2 := (x > 0) and ((x and Pred(x)) = 0) end;
Вычитание двоичных чисел с использованием строк
function IntToBin(bin: longint): string;
var bin_s: string;
begin
bin_s := '';
if bin = 0 then bin_s := '0'
else
while bin <> 0 do begin
if (bin and 1) = 1 then
bin_s := '1' + bin_s
else bin_s := '0' + bin_s;
bin := bin shr 1;
end;
IntToBin := bin_s
end;
function BinToInt(bin_s: string): longint;
var
bin, mult: longint;
i: integer;
begin
mult := 1; bin := 0;
for i := length(bin_s) downto 1 do begin
if bin_s[i] = '1' then bin := bin + mult;
mult := mult shl 1;
end;
BinToInt := bin
end;
var
BO, BT: string;
begin
write('Введите первое число : ');
readln(BO);
write('Введите второе число : ');
readln(BT);
writeln( 'Результат: ', IntToBin(BinToInt(BO)-BinToInt(BT)) )
end.
Перемножение двоичных чисел с использованием строк
{ Дополнительная функция, реализующая сложение двоичных чисел }
function add_binary(s1, s2: string): string;
var
T, z: string;
i: byte; shift: char;
begin
{ Для удобства будем считать первой строкой более длинную строку... }
if length(s1) < length(s2) then begin
{ Если же длиннее вторая строка, то меняем ее местами с первой }
T := s1; s1 := s2; s2 := T
end;
T := '';
{ Дополняем короткую строку спереди нулями (если необходимо) }
for i := 1 to length(s1) - length(s2) do s2 := '0' + s2;
{ переменная содержит "сдвиг" }
shift := '0';
{
проходим по всей строке (с конца в начало) и выполняем "побитное"
сложение строк с учетом сдвига
}
for i := length(s1) downto 1 do begin
{
z содержит тройку значений:
(1, 2) - очередные "биты" строк
(3) - сдвиг
}
z := s1[i] + s2[i] + shift;
{
проверяем все возможные комбинации "троек" и добавляем
к результирующей строке спереди соответствующий "бит"
(не забываем учитывать и изменять значение сдвига)
}
if z = '000' then T := '0' + T;
if (z = '001') or (z = '010') or (z = '100') then begin
T := '1' + T; shift := '0'
end;
if (z = '101') or (z = '011') or (z = '110') then begin
T := '0' + T; shift := '1'
end;
if z = '111' then begin
T := '1' + T; shift := '1'
end;
end;
{ если есть необходимость, добавляем "сдвиговый" "бит" к строке }
if (shift = '1') then T := '1' + T;
{ и возвращаем результат - двоичную сумму строк s1 и s2 }
add_binary := T
end;
const
n = 4;
{
константы для проверки работоспособности...
s1: string = '0111';
s2: string = '0010';
}
result: string = '0';
var
i, j: byte;
s1, s2, toadd: string;
begin
write( 'Введите первое число: ' ); readln(s1);
write( 'Введите второе число: ' ); readln(s2);
for i := 1 to n do begin
{ 1-я строка содержит в последнем бите 1 }
if s2[ length(s2) ] = '1' then begin
{
для промежуточного результата нам необходимо значение
второй строки...
}
toadd := s1;
{
... сдвинутое на количество бит, соответствующее позиции
единицы в 1-ой строке
}
for j := 1 to pred(i) do toadd := toadd + '0';
{ добавляем промежуточный результат к окончательному }
result := add_binary(result, toadd)
end;
{ по окончании обработки очередного бита 1-ой строки удаляем его... }
delete(s2, length(s2), 1)
end;
{ удаляем лидирующие (незначащие) нули из результата }
while result[1] = '0' do
delete(result, 1, 1);
{ печатаем результат }
writeln('result = ', result);
readln;
end.
Как вычислить арксинус аргумента?
function ArcSin(x: real): real; begin if (1 - Abs(x)) < 10E-3 then ArcSin := x * Pi/2 else ArcSin := ArcTan( (x) / Sqrt(1 - Sqr(x)) ) end;
Как вычислить арккосинус аргумента?
function ArcCos(x: real): real; begin if Abs(x) < 10E-3 then ArcCos := Pi/2 else ArcCos := ArcTan(Sqrt(1 - Sqr(x)) / x) + Pi * Byte(x < 0) end;
Как самому написать функцию Ln(x)?
function _Ln(x: double): double;
const eps = 0.0000001; { Задаем точность }
var
s, next: double;
n: integer;
begin
next := (x - 1)/(x + 1);
s := next; n := 1;
repeat
inc(n, 2);
next := (next * sqr(x - 1))/sqr(x + 1);
s := s + next/n;
until (next/n) < eps;
_Ln := 2 * s
end;
Как самому написать функцию Exp(x)?
function _Exp(x: double): double;
const eps = 0.0000001; { Задаем точность }
var
s, next: double;
n: integer;
begin
next := 1;
s := next; n := 0;
repeat
inc(n);
next := (next * x) / n;
s := s + next;
until (next < eps);
_exp := s
end;