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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.05.2010, 22:12   #1
rmise
Пользователь
 
Регистрация: 07.04.2010
Сообщений: 11
По умолчанию Delphi не правильно умножает

Добрый вечер всем!
Делаю так:
s:=m*b, где m=30, а b=200 000 000 результат получается неверный!!!

а если так:
for m:=1 to 30 do s:=s+b то все правильно получается!!

Может кто знает как это понимать и как с этим бороться?
Заранее благодарен за ответ!!
rmise вне форума Ответить с цитированием
Старый 04.05.2010, 22:18   #2
fbus
Форумчанин
 
Аватар для fbus
 
Регистрация: 23.10.2008
Сообщений: 460
По умолчанию

а S как объявлено?
fbus вне форума Ответить с цитированием
Старый 04.05.2010, 22:23   #3
rmise
Пользователь
 
Регистрация: 07.04.2010
Сообщений: 11
По умолчанию

s объявлено как double
rmise вне форума Ответить с цитированием
Старый 04.05.2010, 22:25   #4
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Если бы вы rmise учили бы типы Delphi, то знали что тип integer имеет свои граници: -2147483648..2147483647, а вы пытаетесь задать ему 6 млрд. Используйте Int64, там аж -9223372036854775808..92233720368547 75807
W0LF вне форума Ответить с цитированием
Старый 04.05.2010, 22:25   #5
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

А как проверил что неправильно умножает ?
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 04.05.2010, 22:26   #6
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

размерность типа intger: 2147483647, если у вас s такого типа, то в этом и ошибка, причём ваша, а не делфи
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 04.05.2010, 22:30   #7
rmise
Пользователь
 
Регистрация: 07.04.2010
Сообщений: 11
По умолчанию

WOLF
вообще-то double имеет границы от 2.23 x 10-308 до 1.79 x 10+308
и если бы было переполнение, то цикл for то же бы считал неправильно

в экселе посчитал

кстати если записать так:
s:=30*200 000 000 то вообще не копмилит
а так
for m:=1 to 30 do s:=s+200 000 000
нормально

Последний раз редактировалось Stilet; 05.05.2010 в 13:36.
rmise вне форума Ответить с цитированием
Старый 04.05.2010, 22:43   #8
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Так ! Еще один ищущий ошибки в среде, а не у себя в коде.
1) Вот банальный пример с числами гораздо большими :
Код:
procedure TForm4.Button1Click(Sender: TObject);
var
  s:Extended;
  a,b:Extended;
  ss: string;
begin
  a := 392;
  b := 22300450099;
  s := a * b;
  Str(s:20:0, ss);
  label1.Caption := ss;
end;
00002.jpg
... ну и MS Excel 2010 :
00003.jpg
И где тут неправильность ?!

2) Погугли на предмет ошибок в MS Office ... Просто для изучения ...
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 04.05.2010, 22:45   #9
rmise
Пользователь
 
Регистрация: 07.04.2010
Сообщений: 11
По умолчанию

спасибо, щас попробую

Неа все равно не катит!
Excel то правильно считает, а у меня результат получается меньше чем 200 000 000!!!!!!

получилось только тогда, когда оба множителя типа extended
спасибо, но возникла другая проблема, как перевести Extended в int64?

во я туплю!!!! надо спать ложиться!
спасибо за помошь, истина где-то рядом

Последний раз редактировалось Stilet; 05.05.2010 в 13:40.
rmise вне форума Ответить с цитированием
Старый 05.05.2010, 09:25   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Всем, всем, всем.

Крайне настоятельно рекомендую ознакомится со статьёй.

Неочевидные особенности вещественных чисел (с) Григорьев Антон

(и знать, как оно там внутри, полезно не только программистам на Delphi )
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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