Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 10:40   #11
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

rmise, от твоих постов в глазах пястрит уже, почитай правила, пока тебя не оштрафовали, запрещено создавать два и более постов подряд, для этого есть кнопка "Правка"
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 05.05.2010, 10:51   #12
настенка=)
Пользователь
 
Аватар для настенка=)
 
Регистрация: 05.05.2010
Сообщений: 11
По умолчанию

Ребятки,всем привет=))))
мне нужна помощь по бейсику....
настенка=) вне форума Ответить с цитированием
Старый 05.05.2010, 10:54   #13
vedro-compota
любитель-далеко не
Участник клуба
 
Аватар для vedro-compota
 
Регистрация: 13.04.2010
Сообщений: 1,156
По умолчанию ну так создай тему))

тему создай))
против абортов=за + жизнь;.фкн вгу;_______________________мойблг
vedro-compota вне форума Ответить с цитированием
Старый 05.05.2010, 12:21   #14
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Я думаю, что rmise попал в "ловушку" компилятора. Проблема уже несколько раз встречалась на форуме.
Вся проблема в строчке s:=m*b; если переменные m или b имеют тип недостаточный для хранения результата их операции. То есть эта строчка с точки зрения машины рассматривается как 2 разных команды. Первая - это умножение m и b, а вторая присваивание результата умножения переменной s. Вот в результате первой команды и происходит переполнение, так как результат будет храниться в типе которых минимально подходит для m и b (в примере это тип integer). А невиновной переменной s присваивается уже заведомо ложное значение.
Выход либо в разделении этих 2-х "команд", либо в явнов указании их типов. См, пример:
Код:
var
  m:byte;
  b:integer;
  s:double;
begin
  m:=30;
  b:=200000000;

  s:=m*b;
  writeln(s:0:1);

  s:=m;
  s:=s*b;
  writeln(s:0:1);
  readln
END.
eoln вне форума Ответить с цитированием
Старый 05.05.2010, 12:48   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от rmise Посмотреть сообщение
s объявлено как double
Это ошибки округления, а не среды программирования и Экзель им подвержен тоже. Связано с логикой работы математического сопроцессора.
ЗЫ. Даю наводку, есть такая вещь как гугл...
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 05.05.2010, 13:50   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
получилось только тогда, когда оба множителя типа extended
Проверил на Д6: var s:Double;b,m:Double; результ = 6.00000000000000E+0009 - Все правильно считает, то ты явно типы операндов неверные взял. Если так:
Код:
s:Double;b,m:integer;
То да это неправильно, потому что первый операнд имеет тип отличный от типа результата, Но если он будет иметь тип сходный с типом результата, то преобразование типов (перед вычислением) пройдет правильно:
Код:
s:Double;m:Double;b:integer;
Иногда для приведения типов использую такой финт:
Код:
var  e,s:Double;m:integer;b:integer;

begin      
 m:=30; b:=200000000;e:=1;
 s:=e*m*b;
  { TODO -oUser -cConsole Main : Insert code here }
  write(s);readln;
end.
Здесь e не несет числовой нагрузки, а нужно только для того чтоб указать компилятору к какому типу привести результат.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.05.2010, 14:25   #17
Vlad_55
Пользователь
 
Регистрация: 03.11.2007
Сообщений: 22
По умолчанию

Мдя...это ещё rmise до деления не дошел Там-то вообще "ошибок" тучи! Например так:
Код:
procedure TMainForm.FormCreate(Sender: TObject);
var a,b,c:single;
begin
  a:=9.8;
  b:=1000000;
  c:=a/b;
 ShowMessage(FloatToStr(a)+#10#13+FloatToStr(b)+#10#13+FloatToStr(c))
end;
Резульат:

Что-то явно не так, да?
А теперь с extended:
Код:
procedure TMainForm.FormCreate(Sender: TObject);
var a,b,c:extended;
begin
  a:=9.8;
  b:=1000000;
  c:=a/b;
  ShowMessage(FloatToStr(a)+#10#13+FloatToStr(b)+#10#13+FloatToStr(c))
end;

Во так вот. Правильно надо типы данных подбирать. А говорить, что Delphi не правильно умножает я бы не стал...
WebDelphi.ru - блог о программировании на Delphi
Vlad_55 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу которая все элементы мссива умножает на 2 FranZuZ Помощь студентам 4 18.02.2010 15:54
правильно ли?? Babur4iK Помощь студентам 1 28.01.2010 13:22
Delphi. Как правильно подключить модуль? SnowFall Помощь студентам 6 12.05.2009 02:34
MySQL + Delphi. Как реализовать правильно? Vlad_55 БД в Delphi 4 19.11.2007 17:10