FAQ VCL
Математика

:: Меню ::
:: На главную ::
:: FAQ ::
:: Заметки ::
:: Практика ::
:: Win API ::
:: Проекты ::
:: Скачать ::
:: Секреты ::
:: Ссылки ::

:: Сервис ::
:: Написать ::

:: MVP ::

:: RSS ::

Яндекс.Метрика

Как вычислить гипотенузу?

// Способ первый
function Hypotenuse(a, b: Double): Double;
begin
  Result := Sqrt(a*a + b*b);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Hypotenuse(3, 4).ToString);
end;

// Способ второй
uses
  Math;

function Hypotenuse(a, b: Double): Double;
var
  _min, _max, r: Double;
begin
  _min := Min(a, b);
  _max := Max(a, b);
  r := _min / _max;

  Result := _max * Sqrt(1 + r*r);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(Hypotenuse(3, 4).ToString);
end;


Как получить дробную часть числа?

// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
const
  x = 2.13;
begin
  ShowMessage(FloatToStr(x - Trunc(x)));
end;

// Способ второй
procedure TForm1.Button1Click(Sender: TObject);
const
  x = 2.13;
begin
  ShowMessage(FloatToStr(Frac(x)));
end;


Как получить остаток от деления без использования оператора mod?

//uses
//  Math;

function ModEx(a, b: Integer): Integer;
begin
  Result := a - Trunc(a/b) * b; // a mod b
  // Некоторые языки, вроде Python, вычисляют
  // остаток через округление до ближайшего
  // меньшего, что эквивалентно формуле:
  // Result := a - Floor(a/b) * b
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ModEx(-8, 5).ToString);
end;


Как получить количество значащих двоичных разрядов в целом числе?

function DigitCount(x: SmallInt): Word;
var
  i: Extended;
begin
  Result := 0;

  i := x;

  if i < 0 then
    i := Power(2, 8 * SizeOf(x)) + x;

  while i >= 1 do
  begin
    Inc(Result);
    i := Trunc(i) div 2;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(DigitCount(15).ToString);  // 4  (SmallInt) - 1111
  ShowMessage(DigitCount(-15).ToString); // 16 (SmallInt) - 1111 1111 1111 0001
end;


Как перемножить 2 положительных целых числа используя операцию сдвига?

// 1. Для начала положим результат равным нулю.
// 2. Пробегаемся по разрядам A.
// 3. Если в разряде 0, ничего не делаем.
// 4. Если в разряде 1, сдвигаем B на соответствующее число разрядов и прибавляем к результату.
function ShearMultiplication(a, b: SmallInt; Digit: Byte): LongInt;
var
  i: Integer;
begin
  Result := 0;

  for i := 0 to Digit-1 do
    if a and (1 shl i) <> 0 then
      Result := Result + (b shl i);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ShearMultiplication(2, 3, 3).ToString);
end;


Как преобразовать Integer в HEX?

// Способ первый
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToHex(123654));
end;

// Способ второй
function ToHex(Num: UInt64): string;
const
  Hex: string = '0123456789ABCDEF';
begin
  if Num = 0 then
     Result := '0'
  else
    while Num > 0 do
    begin
      Result := Hex[(Num and $F) + 1] + Result;
      Num := Num shr 4;
    end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(ToHex(123654));
end;