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;