как заставить модуль Delphi работать в Turbo Pascal 7.0 (помогите)
P.S. TP не знаю, помню что там string это Delphi string[255].
а самому чет не получается
тут просто функции и операторы из делфи
еслиб знать как они работают
и как их можно реализовать на паскале то дело в шляпе
1. Если в TP string с длиной больше 255? Нет: надо написать свой (хоть что то типа char[512])
2. Если аналог AnsiString?
3. Есть ли аналог TNumber?
4. Что то еще.
Вообщем я бы забил на это, прочитал книгу и сделал сам!
поддержка строки больше 255 просто через переадресацию
с использованием дерективы {$X+}
Огромные числа
Данный модуль использует массив байт для предоставления БОЛЬШИХ чисел. Бинарно-хранимые числа заключены в массив, где первый элемент является Наименьшим Значимым Байтом (Least Significant Byte - LSB последний - Наибольшим Значимым Байтом (Most Significant Byte - MSB подобно всем Intel-целочисленным типам.
Арифметика здесь использует не 10- или 2-тиричную, а 256-тиричную систему исчисления, чтобы каждый байт представлял одну (1) цифру.
Числа HugeInttype - Подписанные Числа (Signed Numbers).
При компиляции с директивой R+, ADD и MUL могут в определенных обстоятельствах генерировать "Arithmetic Overflow Error" (RunError(215 - ошибка арифметического переполнения. В таком случае пользуйтесь переменной "HugeIntCarry".
Переменная "HugeIntDiv0" используется для проверки деления на ноль.
Используйте {$DEFINE HugeInt_xx } или поле "Conditional defines" (символ условного компилирования) в "Compiler options" (опции компилятора) для задания размерности, где xx должно быть равно 64, 32 или 16, в противном случае HugeIntSize будет равен 8 байтам.
unit HugeInts;
interface
const
{$IFDEF HugeInt_64 }
HugeIntSize = 64;
{$ELSE}{$IFDEF HugeInt_32 }
HugeIntSize = 32;
{$ELSE}{$IFDEF HugeInt_16 }
HugeIntSize = 16;
{$ELSE}
HugeIntSize = 8;
{$ENDIF}{$ENDIF}{$ENDIF}
HugeIntMSB = HugeIntSize - 1;
type
HugeInt = array[0..HugeIntMSB] of Byte;
const
HugeIntCarry: Boolean = False;
HugeIntDiv0: Boolean = False;
procedure HugeInt_Min(var a: HugeInt); { a := -a }
procedure HugeInt_Inc(var a: HugeInt); { a := a + 1 }
procedure HugeInt_Dec(var a: HugeInt); { a := a - 1 }
procedure HugeInt_Add(a, b: HugeInt; var R: HugeInt); { R := a + b }
procedure HugeInt_Sub(a, b: HugeInt; var R: HugeInt); { R := a - b }
procedure HugeInt_Mul(a, b: HugeInt; var R: HugeInt); { R := a * b }
procedure HugeInt_Div(a, b: HugeInt; var R: HugeInt); { R := a div b }
procedure HugeInt_Mod(a, b: HugeInt; var R: HugeInt); { R := a mod b }
function HugeInt_IsNeg(a: HugeInt): Boolean;
function HugeInt_Zero(a: HugeInt): Boolean;
function HugeInt_Odd(a: HugeInt): Boolean;
function HugeInt_Comp(a, b: HugeInt): Integer; {-1:a< 0; 1:a>}
procedure HugeInt_Copy(Src: HugeInt; var Dest: HugeInt); { Dest := Src }
procedure String2HugeInt(AString: string; var a: HugeInt);
procedure Integer2HugeInt(AInteger: Integer; var a: HugeInt);
procedure HugeInt2String(a: HugeInt; var S: string);
implementation
procedure HugeInt_Copy(Src: HugeInt; var Dest: HugeInt);
{ Dest := Src }
begin
Move(Src, Dest, SizeOf(HugeInt;
end; { HugeInt_Copy }
function HugeInt_IsNeg(a: HugeInt): Boolean;
begin
HugeInt_IsNeg := a[HugeIntMSB] and $80 > 0;
end; { HugeInt_IsNeg }
function HugeInt_Zero(a: HugeInt): Boolean;
var
i: Integer;
begin
HugeInt_Zero := False;
for i := 0 to HugeIntMSB do
if a[i] <> 0 then
Exit;
HugeInt_Zero := True;
end; { HugeInt_Zero }
function HugeInt_Odd(a: HugeInt): Boolean;
begin
HugeInt_Odd := a[0] and 1 > 0;
end; { HugeInt_Odd }
function HugeInt_HCD(a: HugeInt): Integer;
var
i: Integer;
begin
i := HugeIntMSB;
while (i > 0) and (a[i] = 0) do
Dec(i);
HugeInt_HCD := i;
end; { HugeInt_HCD }
procedure HugeInt_SHL(var a: HugeInt; Digits: Integer);
{ Перемещение байтов переменной "Digits" в левую часть,
байты "Digits" будут 'ослабевать' в MSB-части.
LSB-часть заполняется нулями. }
var
t: Integer;
b: HugeInt;
begin
if Digits > HugeIntMSB then
FillChar(a, SizeOf(HugeInt 0)
else if Digits > 0 then
begin
Move(a[0], a[Digits], HugeIntSize - Digits);
FillChar(a[0], Digits, 0);
end; { else if }
end; { HugeInt_SHL }
procedure HugeInt_SHR(var a: HugeInt; Digits: Integer);
var
t: Integer;
begin
if Digits > HugeIntMSB then
FillChar(a, SizeOf(HugeInt 0)
else if Digits > 0 then
begin
Move(a[Digits], a[0], HugeIntSize - Digits);
FillChar(a[HugeIntSize - Digits], Digits, 0);
end; { else if }
end; { HugeInt_SHR }
procedure HugeInt_Inc(var a: HugeInt);
{ a := a + 1 }
var
i: Integer;
h: Word;
begin
i := 0;
h := 1;
repeat
h := h + a[i];
a[i] := Lo(h);
h := Hi(h);
Inc(i);
until (i > HugeIntMSB) or (h = 0);
HugeIntCarry := h > 0;
{$IFOPT R+ }
if HugeIntCarry then
RunError(215);
{$ENDIF}
end; { HugeInt_Inc }
procedure HugeInt_Dec(var a: HugeInt);
{ a := a - 1 }
var
Minus_1: HugeInt;
begin
{ самый простой способ }
FillChar(Minus_1, SizeOf(HugeInt $FF); { -1 }
HugeInt_Add(a, Minus_1, a);
end; { HugeInt_Dec }
procedure HugeInt_Min(var a: HugeInt);
{ a := -a }
var
i: Integer;
begin
for i := 0 to HugeIntMSB do
a[i] := not a[i];
HugeInt_Inc(a);
end; { HugeInt_Min }
function HugeInt_Comp(a, b: HugeInt): Integer;
{ a = b: ==0; a > b: ==1; a < b: ==-1 }
var
A_IsNeg, B_IsNeg: Boolean;
i: Integer;
begin
A_IsNeg := HugeInt_IsNeg(a);
B_IsNeg := HugeInt_IsNeg(b);
if A_IsNeg xor B_IsNeg then
if A_IsNeg then
HugeInt_Comp := -1
else
HugeInt_Comp := 1
else
begin
if A_IsNeg then
HugeInt_Min(a);
if B_IsNeg then
HugeInt_Min(b);
i := HugeIntMSB;
while (i > 0) and (a[i] = b[i]) do
Dec(i);
if A_IsNeg then { оба отрицательные! }
if a[i] > b[i] then
HugeInt_Comp := -1
else if a[i] < b[i] then
HugeInt_Comp := 1
else
HugeInt_Comp := 0
else { оба положительные } if a[i] > b[i] then
HugeInt_Comp := 1
else if a[i] < b[i] then
HugeInt_Comp := -1
else
HugeInt_Comp := 0;
end; { else }
end; { HugeInt_Comp }
procedure HugeInt_Add(a, b: HugeInt; var R: HugeInt);
{ R := a + b }
var
i: Integer;
h: Word;
begin
h := 0;
for i := 0 to HugeIntMSB do
begin
h := h + a[i] + b[i];
R[i] := Lo(h);
h := Hi(h);
end; { for }
HugeIntCarry := h > 0;
{$IFOPT R+ }
if HugeIntCarry then
RunError(215);
{$ENDIF}
end; { HugeInt_Add }
procedure HugeInt_Sub(a, b: HugeInt; var R: HugeInt);
{ R := a - b }
var
i: Integer;
h: Word;
begin
HugeInt_Min(b);
HugeInt_Add(a, b, R);
end; { HugeInt_Sub }
procedure HugeInt_Mul(a, b: HugeInt; var R: HugeInt);
{ R := a * b }
var
i, j, k: Integer;
A_end, B_end: Integer;
A_IsNeg, B_IsNeg: Boolean;
h: Word;
begin
A_IsNeg := HugeInt_IsNeg(a);
B_IsNeg := HugeInt_IsNeg(b);
if A_IsNeg then
HugeInt_Min(a);
if B_IsNeg then
HugeInt_Min(b);
A_End := HugeInt_HCD(a);
B_End := HugeInt_HCD(b);
FillChar(R, SizeOf(R 0);
HugeIntCarry := False;
for i := 0 to A_end do
begin
h := 0;
for j := 0 to B_end do
if (i + j) < HugeIntSize then
begin
h := h + R[i + j] +
мне ето не к чему
задача многократно повысить точность
в паскале максимум (если своего не писать) 20 знаков после запятой
ето очень мао мне надо как минимум 1000 как ето сделать может есть идеи поделитесь
Обычная практика, если например double не поддерживается аппаратно, переводить дробные в целые, работать с уже целыми числами и потом переводить обратно в дробные.
А зачем тебе обязательно Turbo Pascal? Если нужно, чтобы под досом работало, то можно Free Pascal`ем скомпилить.
(при больших значениях число преобрзуется к двадцатизначным числам (смещение разряда
Turbo Pascal нужет потому, что на нем написана программа,
необходимо только повысить ее точность
А обязательно, чтобы результирующая программа была под TP? Может, проще всю программу под Delphi переделать? Delphi почти полностью компилирует код под TP.
поставил delphi
перенес проги и скомпилил их
а можуль чето не работает нихера
т.е. работает но считает не правильно
может кто посмотрит в чем ошибка?
"модуль не работает нифига"? Пардон, но не буду. Отладчик тебе в помощь.
что касаеться математической модели
итерестное предложение но
при работе с многочленом 20 степени в окресности
7ми приходиться оперировать с числами
порядка 7^20=7'979'266'297'612'001.0000 вот что ето такое
так что при работе с такими числами точность выще 4 знака не получить
ны а если говорить про более высокие числа
то там вообце о точности до сотни или тысячи
что непеемлемо
вот так
как быть
P.S.Ча сплю с многочленими Чебышева может они меня удовлетворят
Оставить комментарий
balera1111
субж