как заставить модуль Delphi работать в Turbo Pascal 7.0 (помогите)
Проще немного посидеть и написать самому. Для адаптации надо string видимо свой писать (в том числе и все функции, которые для него вызываются).
P.S. TP не знаю, помню что там string это Delphi string[255].
P.S. TP не знаю, помню что там string это Delphi string[255].
string и string[255]
а самому чет не получается
тут просто функции и операторы из делфи
еслиб знать как они работают
и как их можно реализовать на паскале то дело в шляпе
а самому чет не получается
тут просто функции и операторы из делфи
еслиб знать как они работают
и как их можно реализовать на паскале то дело в шляпе
Если бы мне приспичило реализовать такой перевод, то я бы первым делом озаботился поиском ответов на эти вопросы
1. Если в TP string с длиной больше 255? Нет: надо написать свой (хоть что то типа char[512])
2. Если аналог AnsiString?
3. Есть ли аналог TNumber?
4. Что то еще.
Вообщем я бы забил на это, прочитал книгу и сделал сам!
1. Если в TP string с длиной больше 255? Нет: надо написать свой (хоть что то типа char[512])
2. Если аналог AnsiString?
3. Есть ли аналог TNumber?
4. Что то еще.
Вообщем я бы забил на это, прочитал книгу и сделал сам!
TNumber просто переменная сируктурниго типа
поддержка строки больше 255 просто через переадресацию
с использованием дерективы {$X+}
поддержка строки больше 255 просто через переадресацию
с использованием дерективы {$X+}
А вот это не скомпиляецца? (с того же FAQ) На первый взгляд вообще ничего специфчного нет.
Огромные числа
Данный модуль использует массив байт для предоставления БОЛЬШИХ чисел. Бинарно-хранимые числа заключены в массив, где первый элемент является Наименьшим Значимым Байтом (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] +
етот модель для работы в большими числани в типе 2^100000000000000000000
мне ето не к чему
задача многократно повысить точность
в паскале максимум (если своего не писать) 20 знаков после запятой
ето очень мао мне надо как минимум 1000 как ето сделать может есть идеи поделитесь
мне ето не к чему
задача многократно повысить точность
в паскале максимум (если своего не писать) 20 знаков после запятой
ето очень мао мне надо как минимум 1000 как ето сделать может есть идеи поделитесь
Обычная практика, если например double не поддерживается аппаратно, переводить дробные в целые, работать с уже целыми числами и потом переводить обратно в дробные.
А зачем тебе обязательно Turbo Pascal? Если нужно, чтобы под досом работало, то можно Free Pascal`ем скомпилить.
Никакие целые числа не дадут точности до тысячного знака
(при больших значениях число преобрзуется к двадцатизначным числам (смещение разряда
Turbo Pascal нужет потому, что на нем написана программа,
необходимо только повысить ее точность
(при больших значениях число преобрзуется к двадцатизначным числам (смещение разряда
Turbo Pascal нужет потому, что на нем написана программа,
необходимо только повысить ее точность
Мне кажется, накладные расходы по переводу Delphi на TP будут слишком велики.
А обязательно, чтобы результирующая программа была под TP? Может, проще всю программу под Delphi переделать? Delphi почти полностью компилирует код под TP.
А обязательно, чтобы результирующая программа была под TP? Может, проще всю программу под Delphi переделать? Delphi почти полностью компилирует код под TP.
вот блин
поставил delphi
перенес проги и скомпилил их
а можуль чето не работает нихера
т.е. работает но считает не правильно
может кто посмотрит в чем ошибка?
поставил delphi
перенес проги и скомпилил их
а можуль чето не работает нихера
т.е. работает но считает не правильно
может кто посмотрит в чем ошибка?
пересматривать 500 строчек на предмект поиска ошибки из-за которой
"модуль не работает нифига"? Пардон, но не буду. Отладчик тебе в помощь.
"модуль не работает нифига"? Пардон, но не буду. Отладчик тебе в помощь.
модуль работает но выдает неверные результаты
что касаеться математической модели
итерестное предложение но
при работе с многочленом 20 степени в окресности
7ми приходиться оперировать с числами
порядка 7^20=7'979'266'297'612'001.0000 вот что ето такое
так что при работе с такими числами точность выще 4 знака не получить
ны а если говорить про более высокие числа
то там вообце о точности до сотни или тысячи
что непеемлемо
вот так
как быть
P.S.Ча сплю с многочленими Чебышева может они меня удовлетворят
что касаеться математической модели
итерестное предложение но
при работе с многочленом 20 степени в окресности
7ми приходиться оперировать с числами
порядка 7^20=7'979'266'297'612'001.0000 вот что ето такое
так что при работе с такими числами точность выще 4 знака не получить
ны а если говорить про более высокие числа
то там вообце о точности до сотни или тысячи
что непеемлемо
вот так
как быть
P.S.Ча сплю с многочленими Чебышева может они меня удовлетворят
Оставить комментарий
balera1111
субж