![]() |
|
Модераторы: 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 -------------------- С уважением, г-н Посол. |
|||
|
||||
| x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
мда. оптимизитары хреновы. я помню, долго веселился, когда обнаружил, что от перестановки местами полей разных типов в записи, меняется размер записи. понятно там, packed record'ы есть, в семёрке вообще выравнивание по границе можно руками выставлять, но всё равно: нафига, спрашивается? а недавно наткнулся на статью, где какой-то мудрый чувак советует за счёт таких перестановок "минимизировать размер приложения". у него в примере размер класса в памяти уменьшился на 8 байт. дескать, если у вас экземпляров класса ТЫЩИ, то по 8 байт на ТЫЩУ, это ж целых 8 КИЛОБАЙТОФФ!!! да хоть мегов восемь, для прикладного программирования, особенно в корпоративных разработках, читабельность кода намного дороже размера экзешника.
а другой фрукт как-то с пеной у рта мне доказывал, что Fields [0] работает быстрее, чем FieldByName. в принципе - да. быстрее. на доли миллисекунды. но доказывать ему, что по сравнению со скоростью доступа к базе это просто [censored34! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме], и ничего он на такой "оптимизации" не выйграет, а вот в коде может напороть как с добрым утром, - бесполезно. и куда этот мир катиться? З.Ы. Vit, сорри за оффтоп. -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
| Dmitry V.Abramov |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
Gute frage... А вот еще просто замечательный вопрос:
И просто шикарно выглядит генерируемый код для "OK !!!!":
No comments... Cashey может претендовать на звание багооткрывателя --------------------
/DVA |
||||||
|
|||||||
| Cashey |
|
||||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Ну знаешь, ситуации бывают разные. У меня была такая: одна редиска вскрыла прогу разрабатываемую фирмой, где я работаю, и было принято решение срочно заменить кодировку (прога бухгалтерская, поэтому обновляется много раз в течении года). и вот мне - автору журнала учета- было приказано перерегистрить наших официальных пользователей автоматически, сам кодировщик зделали программеры создавшие прогу, поэтому он был на FOXPRO в DLL и работал в моем журнале (Delphi 5) через OLE Server. Так вот пришлось писать цикл, вытаскивать из базы Paradox (через драйвер BDE) все записи (> 50.000) прогонять их через OLE и загонять обратно. У меня тогда еще старый комп стоял (C266, 64Mb). Вот и думай кокого было, а я все делал с помощью fielbyname и здесь замена на field[0] было оправдано (даже очень)
Да уж, вот только гордится здесь нечем -------------------- библия учит любить ближнего, а камасутра обучает как именно |
||||
|
|||||
| p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 58 Всего: 112 |
Согласен с Cashey. У меня тоже бывало такое, что нужна была скорость в БД - фильтрация таблицы из 20000 записей должна была делаться вручную, т.е. каждая запись проверялась моей процедуркой - я для каждого поля создавал отдельный компонент, скорость получилась приличная. Кстати, так читать даже легче прогу:
Table1.FieldByName('Street').AsString := ... и tb1Street.Value := ... -------------------- С уважением, г-н Посол. |
|||
|
||||
| Dmitry V.Abramov |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 177 Регистрация: 30.9.2003 Где: Saint-Petersburg Репутация: 5 Всего: 4 |
А.... ээээээ.... причем здесь оптимизация? Есть явный прокол в генерации кода, а если бы генератор не был оптимизирующим, то он бы нам НЕ сообщимл "FOR or WHILE loop executes zero times - deleted" и ....... (дальше каждого должен быть свой набор матюгов ).
Так что, в данном случае, я бы сказал спасибо оптимизации. --------------------
/DVA |
|||
|
||||
![]()
|
| Правила форума "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. |