Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа ф-ции деления, в цикле 
:(
    Опции темы
Cashey
Дата 29.9.2003, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Взбрела тут мне в голову идея проверить правильность утверждения, что предел, стремящийся к нулю, нуля никогда не достигнет. Написал маленькую ф-цию, которая, как мне казалось, должна работать
Код
procedure TForm1.Button1Click(Sender: TObject);
var
r: Extended;
i: Cardinal;
begin
r:= strtofloat(edit1.Text);
for i:=0 to 4294967295 do
begin
r := r / 2;
end;
label1.Caption := floattostr(r);
end;

А он мне после цикла всегда выдает значение которое ввел изначально(edit1.Text), т.е. цикл не отрабатывает. Но почему?


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
x77
Дата 29.9.2003, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



не знаю. знаю только, что до 1083 цикл работает, а до 1084 - нет. забавно, первый раз такое вижу. смена типа счётчика ничего не даёт. %)


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
stab
Дата 29.9.2003, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



чего-то они там с оптимизацией перемудрили из борланда smile.gif прикольно smile.gif У меня пишет, что цикл исполняется 0 раз и по сей причине удален smile.gif если поставить не 4294967295, а скажем 1000000 то все ок


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Cashey
Дата 29.9.2003, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Цитата
не знаю. знаю только, что до 1083 цикл работает, а до 1084 - нет. забавно, первый раз такое вижу. смена типа счётчика ничего не даёт. %)

Я тоже заметил, что дело в кол-ве циклов, только у меня до 16381, с чем бы это могло быть связано. О! я знаю - здесь нужен p0s0l smile.gif
После ответа cully, у меня закралось подозрение, что кол-во исполняемых циклов зависит не от оптимизации, а от процессора на котором исполняется цикл. Правда не уверен, что такое возможно.

Это сообщение отредактировал(а) Cashey - 29.9.2003, 18:55


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
p0s0l
Дата 29.9.2003, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
О! я знаю - здесь нужен p0s0l

smile.gif Я здесь!

Чтобы заставить сделать цикл сделать 4294967295 шагов надо написать такое:
var i : integer;
for i := Low(i) to High(i) do r := r/2

Но т.к. в extended на порядок отводится только 16 бит, то если сделать цикл чуть больше 2^16, то получится 0 из-за переполнения...

Цитата
После ответа cully, у меня закралось подозрение, что кол-во исполняемых циклов зависит не от оптимизации, а от процессора на котором исполняется цикл

Код вообще не генерится для цикла - так что будь тут хоть какой проц, а если кода нет, то и выполнятся нечему...

И оптимизация здесь не причем...
Почему ? Пример цикла:
for i := 0 to -100 do;
Этот цикл что при включенной, что при выключенной оптимизации не будет компилироваться... Т.е. компилироваться будет, но он просто пропустится, код не сгенерится для него...

А в нашем случае проблема из-за того, что максимальный тип переменной цикла может быть integer, а не cardinal... (как выяснилось)
Поэтому число 4294967295 воспринимается как integer(4294967295) = -1 !
И эти два цикла абсолютно идентичны:
var i : integer;
for i := 0 downto 4294967295 do r := r/2;
for i := 0 downto -1 do r := r/2;




--------------------
С уважением, г-н Посол.
PM   Вверх
x77
Дата 29.9.2003, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



да, но это не объясняет глюков у меня на тачке smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Cashey
Дата 29.9.2003, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Спасибо, p0s0l, только это озночает, что Delphi не позволяет гонять цикл больше 2147483647 раз (int64 он тоже ставить не позволяет), очень прискорбно sad.gif
И потом, это не объясняет, почему этот цикл на разных машинах отрабатывается разное кол-во раз ( у x77 - 1083, у меня 16381, а у cully не менее 1000000)?

Это сообщение отредактировал(а) Cashey - 29.9.2003, 23:07


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
stab
Дата 29.9.2003, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: 14
Всего: 48



Мдя, странные решение применяет borland в своем компиляторе, очень странные. Первые 2-3 года знакомства с дельфи я был просто в восторге, но чем дальше тем хуже и хуже. Придется полностью переходить на C# smile.gif


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 30.9.2003, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
И потом, это не объясняет, почему этот цикл на разных машинах отрабатывается разное кол-во раз...

Что ты под этим подразумеваешь ? Если что разное количество шагов нужно для получения нуля, то это объясняется разными начальными значениями r... Если ты имел в виду не это, то по-конкретней объясни...




--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 30.9.2003, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Цитата
Delphi не позволяет гонять цикл больше 2147483647 раз

Я же написал:
Цитата
Чтобы заставить сделать цикл сделать 4294967295 шагов надо написать такое:
var i : integer;
for i := Low(i) to High(i) do r := r/2


Кстати, cully писал о том, что цикл у него компилируется, например, при 1000000 вместо 4294967295. Но это не то, про что писал cashey или x77...
Cashey писал о 16381 в том смысле, что после этого получается 0... Я как раз про это и говорил, что на порядок отводится 16 бит, только видимо ошибся на 1 бит, плюс еще один бит нужен для знака, поэтому максимально в порядке может быть не 2^16, а 2^14 = 16384. Я так понял, что ты как начальное значение r ставил 1. По-смыслу должно быть 16385 шагов, но видимо какие-то там тонкости есть, так что вместо этого хватает 16381 шага...
А x77 вообще использовал real вместо extended, а у real на порядок отводится где-то около 10 или 11 бит, поэтому максимум шагов нужно делать около 2^10 = 1024, плюс еще видимо число может храниться в ненормализованном виде, поэтому еще +около 50 шагов... Вот и получается что-то около 1080, но опять же, немного зависит от значения r...



--------------------
С уважением, г-н Посол.
PM   Вверх
Cashey
Дата 30.9.2003, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Цитата
Чтобы заставить сделать цикл сделать 4294967295 шагов надо написать такое:
var i : integer;
for i := Low(i) to High(i) do r := r/2

Может я чего не допонял но при выполнение вот такой инструкции
Код
var
i: Integer;
s: String;
begin
i:=0;
s:='0';
for i := Low(i) to High(i) do
s := s+'0';
end;

... компилятор выдает:' [Hint] Unit1.pas(39): FOR or WHILE loop executes zero times - deleted'


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
p0s0l
Дата 30.9.2003, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Странный у тебя компилятор, однако... smile.gif
У меня Delphi нормально съедает такой цикл, мне просто влом дожидаться пока он закончиться...
Может у тебя несколько таких циклов и ты не на тот посмотрел ?



--------------------
С уважением, г-н Посол.
PM   Вверх
Dmitry V.Abramov
Дата 30.9.2003, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Цитата(p0s0l @ 30.9.2003, 09:24)
Странный у тебя компилятор, однако... smile.gif

У меня тоже странный - пишет что Borland Delphi Version 14.0. Вот его отношение к скармливаемым тестам:

Код
var
 i: Integer;
 n1, n2: integer;
begin
 n1 := Low(i);
 n2 := High(i);
 writeln(n1, ' ', n2);
 writeln(-MaxInt, ' ', MaxInt);

 for i := n1 to n2 do;      // Ok

 for i := Low(i) to -1 do;  // Ok
 for i := Low(i) to 0 do;   // FOR or WHILE loop executes zero times - deleted

 for i := -1 to High(i) do; // FOR or WHILE loop executes zero times - deleted
 for i := 0 to High(i) do;  // Ok

 for i := -MaxInt to MaxInt do; // FOR or WHILE loop executes zero times - deleted

 for i := -2147483648 to 2147483647 do; // FOR or WHILE loop executes zero times - deleted
end.


Интересно, как обстоят дела в D5 и D7 ?
--------------------
/DVA
PM MAIL WWW   Вверх
Dmitry V.Abramov
Дата 30.9.2003, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 30.9.2003
Где: Saint-Petersburg

Репутация: 5
Всего: 4



Цитата(cully @ 29.9.2003, 23:24)
Мдя, странные решение применяет borland в своем компиляторе, очень странные. Первые 2-3 года знакомства с дельфи я был просто в восторге, но чем дальше тем хуже и хуже.


А есть безупречные компиляторы? Достаточно заглянуть внутрь любого (ну может быть почти любого) сишного исходника из достаточно популярной библиотеки - коментарии к некоторым ошибкам компиляторов бывают просто шикарны и матерны.

Буржуи не зря так ценят толстый экспиренс и разбитый об грабли лоб.

Цитата
Придется полностью переходить на C# :)


Андерс Хейльсберг, автор C# и ведущий архитектор .NET, пришел в Microsoft в 1996 году. Предыдущее его место работы с 1983 года называлось... не поверишь... Borland Incorporated. Является автором и архитектором ... опять не поверишь... Turbo Pascal'я, Borland Pascal'я, Delphi. Вобщем, наш чувак в доску. И ни куда нам от его ошибок не деться.

:)
--------------------
/DVA
PM MAIL WWW   Вверх
p0s0l
Дата 30.9.2003, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 58
Всего: 112



Dmitry V.Abramov - у меня все твои циклы откомпилировались нормально кроме последнего. У меня D7 - видимо учли пару багов...
Вот насчет последнего цикла (твой цикл вообще выдавал ошибку):
Код
for i := -2147483648 to 2147483647 do; // Overflow in conversion or arithmetic operation
for i := -2147483647 to 2147483647 do; // OK
for i := -2147483647 to 2147483648 do; // FOR or WHILE loop executes zero times - deleted

Тут такой вопрос появился:
Т.к. Low(i) = -2147483648 (это выяснилось с помощью writeln(n1)), по смыслу эти два цикла д.б. одинаковыми:
for i := -2147483648 to 2147483647 do; // [Error] Overflow in conversion or arithmetic operation
for i := Low(i) to 2147483647 do; // OK

confused.gif?



--------------------
С уважением, г-н Посол.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1845 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.