Показать сообщение отдельно
  #1  
Старый 26.11.2011, 17:53
Змей Змей вне форума
Прохожий
 
Регистрация: 03.11.2011
Сообщения: 18
Репутация: 10
По умолчанию При возведении в квадрат получается отрицательное число

Вот такая проблема. Вот код:
Код:
  i,j:integer;
  data: array of integer;
  okno: array of array of integer;
  E: array of array of  integer;

procedure TForm1.Button1Click(Sender: TObject);
begin

setlength(data,10000);
setlength(okno,199);
setlength(E,199);
for i:=0 to (10000-1) do
data[i]:=i+1;
for i:=0 to (trunc(199-1)) do
begin
setlength(okno[i],100);
setlength(E[i],1);
for j:=0 to (100-1) do
   begin
   okno[i,j]:=data[i*50+j];
   E[i,0]:=E[i,0]+sqr(okno[i,j]);

   if i=160 then
   begin
   memo1.Lines.Add(inttostr(sqr(okno[i,j])));
   memo2.Lines.Add(inttostr(E[i,0]));
   end;

   end;
end;
end;
end.
Некоторые значения в Memo2 получаются отрицательные,хотя не должны.
Причем если не использовать возведение в квадрат(красным), то все работает как и должно.
Пока писал пост смекнул что возможно при возведении в квадрат число слишком большое выходит и не помещается в integer, поменял его на int64 и все нормально заработало, я уже стал праздновать победу, но для дальнейшей проверки ввел другие данные:
Код:
for i:=0 to (10000-1) do
data[i]:=i+1;
data[1002]:=1000000;
И на 20-ом окне опять вылез минус
Мало того, еще и в Memo1 на месте где должен был быть 1000000000000 стоит рандомное отрицательное значение! А ведь int64 должен поддерживать такое число.
Что делать?
Ответить с цитированием