![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Взбрела тут мне в голову идея проверить правильность утверждения, что предел, стремящийся к нулю, нуля никогда не достигнет. Написал маленькую ф-цию, которая, как мне казалось, должна работать
А он мне после цикла всегда выдает значение которое ввел изначально(edit1.Text), т.е. цикл не отрабатывает. Но почему? -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
не знаю. знаю только, что до 1083 цикл работает, а до 1084 - нет. забавно, первый раз такое вижу. смена типа счётчика ничего не даёт. %)
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
чего-то они там с оптимизацией перемудрили из борланда
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Я тоже заметил, что дело в кол-ве циклов, только у меня до 16381, с чем бы это могло быть связано. О! я знаю - здесь нужен p0s0l После ответа cully, у меня закралось подозрение, что кол-во исполняемых циклов зависит не от оптимизации, а от процессора на котором исполняется цикл. Правда не уверен, что такое возможно. Это сообщение отредактировал(а) Cashey - 29.9.2003, 18:55 -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Чтобы заставить сделать цикл сделать 4294967295 шагов надо написать такое: var i : integer; for i := Low(i) to High(i) do r := r/2 Но т.к. в extended на порядок отводится только 16 бит, то если сделать цикл чуть больше 2^16, то получится 0 из-за переполнения...
Код вообще не генерится для цикла - так что будь тут хоть какой проц, а если кода нет, то и выполнятся нечему... И оптимизация здесь не причем... Почему ? Пример цикла: 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; -------------------- С уважением, г-н Посол. |
||||
|
|||||
| x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
да, но это не объясняет глюков у меня на тачке
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Спасибо, p0s0l, только это озночает, что Delphi не позволяет гонять цикл больше 2147483647 раз (int64 он тоже ставить не позволяет), очень прискорбно
И потом, это не объясняет, почему этот цикл на разных машинах отрабатывается разное кол-во раз ( у x77 - 1083, у меня 16381, а у cully не менее 1000000)? Это сообщение отредактировал(а) Cashey - 29.9.2003, 23:07 -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| stab |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1839 Регистрация: 1.1.2003 Репутация: 14 Всего: 48 |
Мдя, странные решение применяет borland в своем компиляторе, очень странные. Первые 2-3 года знакомства с дельфи я был просто в восторге, но чем дальше тем хуже и хуже. Придется полностью переходить на C#
-------------------- 6, 6, 6 - the number of the beast. |
|||
|
||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Что ты под этим подразумеваешь ? Если что разное количество шагов нужно для получения нуля, то это объясняется разными начальными значениями r... Если ты имел в виду не это, то по-конкретней объясни... -------------------- С уважением, г-н Посол. |
|||
|
||||
| p0s0l |
|
||||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Я же написал:
Кстати, 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... -------------------- С уважением, г-н Посол. |
||||
|
|||||
| Cashey |
|
||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Может я чего не допонял но при выполнение вот такой инструкции
... компилятор выдает:' [Hint] Unit1.pas(39): FOR or WHILE loop executes zero times - deleted' -------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Странный у тебя компилятор, однако...
У меня Delphi нормально съедает такой цикл, мне просто влом дожидаться пока он закончиться... Может у тебя несколько таких циклов и ты не на тот посмотрел ? -------------------- С уважением, г-н Посол. |
|||
|
||||
| Dmitry V.Abramov |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
У меня тоже странный - пишет что Borland Delphi Version 14.0. Вот его отношение к скармливаемым тестам:
Интересно, как обстоят дела в D5 и D7 ? --------------------
/DVA |
||||
|
|||||
| Dmitry V.Abramov |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
А есть безупречные компиляторы? Достаточно заглянуть внутрь любого (ну может быть почти любого) сишного исходника из достаточно популярной библиотеки - коментарии к некоторым ошибкам компиляторов бывают просто шикарны и матерны. Буржуи не зря так ценят толстый экспиренс и разбитый об грабли лоб.
Андерс Хейльсберг, автор C# и ведущий архитектор .NET, пришел в Microsoft в 1996 году. Предыдущее его место работы с 1983 года называлось... не поверишь... Borland Incorporated. Является автором и архитектором ... опять не поверишь... Turbo Pascal'я, Borland Pascal'я, Delphi. Вобщем, наш чувак в доску. И ни куда нам от его ошибок не деться. :) --------------------
/DVA |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Dmitry V.Abramov - у меня все твои циклы откомпилировались нормально кроме последнего. У меня D7 - видимо учли пару багов...
Вот насчет последнего цикла (твой цикл вообще выдавал ошибку):
Тут такой вопрос появился: Т.к. 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 -------------------- С уважением, г-н Посол. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |