Статьи по программированию
примеры программного кода
Delphi, Kylix, C, C++, SQL, Visual Basic, Bash, Assembler, 1С
Qt, KOL, MFC, Rx Library, Windows, Linux, Mac OS
Арифметика и системы счисления (11)
-->Корректная функция возведения в степень
Опубликовано codeLocker в 18.07.2008 в 08:35.
ОС: Windows Язык: Delphi/Kylix Раздел: Алгоритмы • Арифметика и системы счисления
function power(Base, Exponent: Extended): Extended;
var ex: extended;
begin
power := 0;
if (exponent <> 0)
and (frac(trunc((1 / exponent) * 1000000) / 1000000) = 0)
and (base < 0) then
begin
if round(1 / exponent) mod 2 = 0 then exit;
ex := Exp(Exponent * Ln(-Base));
power := -ex;
end
else
begin
if Exponent = 0.0 then
power := 1.0
else if (Base = 0.0) and (Exponent > 0.0) then
power := 0.0
else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
var ex: extended;
begin
power := 0;
if (exponent <> 0)
and (frac(trunc((1 / exponent) * 1000000) / 1000000) = 0)
and (base < 0) then
begin
if round(1 / exponent) mod 2 = 0 then exit;
ex := Exp(Exponent * Ln(-Base));
power := -ex;
end
else
begin
if Exponent = 0.0 then
power := 1.0
else if (Base = 0.0) and (Exponent > 0.0) then
power := 0.0
else if (Frac(Exponent) = 0.0) and (Abs(Exponent) <= MaxInt) then
Функция вычисления степени
Опубликовано codeLocker в 18.07.2008 в 08:34.
ОС: Windows Язык: Delphi/Kylix Раздел: Алгоритмы • Арифметика и системы счисления
function Degree(const DegBasis, DegParam: Extended): Extended;
asm
// Вход: DegBasis, DegParam --> в стеке
// Выход: Result --> ST(0)
// Примечание:
// В случае некорректных данных в ST(0) возвращается DegParam
XOR EDX, EDX
FLD DegParam
FTST
FNSTSW AX
SAHF
JNZ @@DegParam_is_not_0
FFREE ST
FLD1
JMP @@exit
@@DegParam_is_not_0:
JC @@DegParam_is_less_than_0
JMP @@cmp_DegBasis_to_0
asm
// Вход: DegBasis, DegParam --> в стеке
// Выход: Result --> ST(0)
// Примечание:
// В случае некорректных данных в ST(0) возвращается DegParam
XOR EDX, EDX
FLD DegParam
FTST
FNSTSW AX
SAHF
JNZ @@DegParam_is_not_0
FFREE ST
FLD1
JMP @@exit
@@DegParam_is_not_0:
JC @@DegParam_is_less_than_0
JMP @@cmp_DegBasis_to_0
Как проверить, является ли число простым?
Опубликовано codeLocker в 18.07.2008 в 08:33.
ОС: Windows Язык: Delphi/Kylix Раздел: Алгоритмы • Арифметика и системы счисления
function IsPrime(N: Cardinal): Boolean; register;
// test if N is prime, do some small Strong Pseudo Prime test in certain bounds
// copyright (c) 2000 Hagen Reddmann, don't remove
asm
TEST EAX,1 { Odd(N) ?? }
JNZ @@1
CMP EAX,2 { N == 2 ?? }
SETE AL
RET
@@1: CMP EAX,73 { N JB @@C }
JE @@E { N == 73 ?? }
PUSH ESI
PUSH EDI
PUSH EBX
PUSH EBP
// test if N is prime, do some small Strong Pseudo Prime test in certain bounds
// copyright (c) 2000 Hagen Reddmann, don't remove
asm
TEST EAX,1 { Odd(N) ?? }
JNZ @@1
CMP EAX,2 { N == 2 ?? }
SETE AL
RET
@@1: CMP EAX,73 { N JB @@C }
JE @@E { N == 73 ?? }
PUSH ESI
PUSH EDI
PUSH EBX
PUSH EBP
Как представить число в другой системе счисления?
Опубликовано codeLocker в 18.07.2008 в 08:32.
ОС: Windows Язык: Delphi/Kylix Раздел: Алгоритмы • Арифметика и системы счисления
function BaseConvert(NumIn: string; BaseIn: Byte; BaseOut: Byte): string;
var
i: integer;
currentCharacter: char;
CharacterValue: Integer;
PlaceValue: Integer;
RunningTotal: Double;
Remainder: Double;
BaseOutDouble: Double;
NumInCaps: string;
s: string;
begin
if (NumIn = '') or (BaseIn < 2) or (BaseIn > 36) or (BaseOut < 1) or (BaseOut > 36) then
begin
Result := 'Error';
Exit;
end;
NumInCaps := UpperCase(NumIn);
PlaceValue := Length(NumInCaps);
RunningTotal := 0;
var
i: integer;
currentCharacter: char;
CharacterValue: Integer;
PlaceValue: Integer;
RunningTotal: Double;
Remainder: Double;
BaseOutDouble: Double;
NumInCaps: string;
s: string;
begin
if (NumIn = '') or (BaseIn < 2) or (BaseIn > 36) or (BaseOut < 1) or (BaseOut > 36) then
begin
Result := 'Error';
Exit;
end;
NumInCaps := UpperCase(NumIn);
PlaceValue := Length(NumInCaps);
RunningTotal := 0;
Конвертация арабских цифр в римские
Опубликовано codeLocker в 18.07.2008 в 08:31.
ОС: Windows Язык: Delphi/Kylix Раздел: Алгоритмы • Арифметика и системы счисления
function IntToRoman(num: Cardinal): String; {returns num in capital roman digits}
const
Nvals = 13;
vals: array [1..Nvals] of word = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
roms: array [1..Nvals] of string[2] = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
var
b: 1..Nvals;
begin
result := '';
b := Nvals;
while num > 0 do
begin
while vals[b] > num do
dec(b);
dec (num, vals[b]);
result := result + roms[b]
end;
end;
const
Nvals = 13;
vals: array [1..Nvals] of word = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
roms: array [1..Nvals] of string[2] = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
var
b: 1..Nvals;
begin
result := '';
b := Nvals;
while num > 0 do
begin
while vals[b] > num do
dec(b);
dec (num, vals[b]);
result := result + roms[b]
end;
end;
Метки
base c
Навигация
Сейчас на сайте
Сейчас на сайте 0 пользователей и 1 гость.
Статистика
Всего материалов: 1387