Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 4 из 4 ПерваяПервая ... 2 3 4
Показано с 31 по 39 из 39
  1. #31
    Аватар для MassonNN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Всё, вопросы?

    1. stock numlen(number)
    2. {
    3. if(number < 0)
    4. {
    5. if(number == cellmin)
    6. number = (-(cellmin+1))+1;
    7. else
    8. number = -number;
    9. }
    10. if (number < 100_000)
    11. {
    12. if (number < 100)
    13. return 1 + _:(number >= 10);
    14. if (number < 10_000)
    15. return 3 + _:(number >= 1_000);
    16. return 5;
    17. }
    18. if (number < 10_000_000)
    19. return 6 + _:(number >= 1_000_000);
    20. if (number < 1_000_000_000)
    21. return 8 + _:(number >= 100_000_000);
    22. return 10;
    23. }
    Он имеет ввиду пропиши этот сток (то есть попробуй заюзать) в main и попробуй скомпилировать.

  2. #32
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от MassonNN Посмотреть сообщение
    Он имеет ввиду пропиши этот сток (то есть попробуй заюзать) в main и попробуй скомпилировать.
    Так ты сам попробуй скомпилировать эту версию из цитированного тобой поста, он идеально компилируется и работает

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Вопрос в том, зачем там вот это
    Для того, чтобы использовать cellmin, замена модуля.

  3. #33
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Лучше, мне кажется, уже нельзя.
    Можно :)

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Значение cellmin некорректно обрабатывается только определёнными функциями. Для условий все твои свистопляски не требуются, ибо всё будет работать корректно.
    Эм... нет, не будет?
    -2147483648 (cellmin) не имеет положительного представления в Pawn (т.е. -cellmin == cellmin), и поэтому первая же проверка (number < 100_000) сработает неправильно и функция выдаст 1.
    Вот тебе и целочисленная арифметика... С другой стороны, в вещественных числах есть "+0" и "-0", которые с технической точки зрения имеют разное представление, но при этом считаются равными друг другу.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. Пользователь сказал cпасибо:
    DeimoS (21.12.2019)
  5. #34
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Steve_Stage Посмотреть сообщение
    Для того, чтобы использовать cellmin, замена модуля.
    1. if(number == cellmin)
    2. number = cellmax;


    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Эм... нет, не будет?
    -2147483648 (cellmin) не имеет положительного представления в Pawn (т.е. -cellmin == cellmin), и поэтому первая же проверка (number < 100_000) сработает неправильно и функция выдаст 1.
    Я немного не так выразил мысль :) Подразумевал то, что если сравнивать именно cellmin, а не пытаться переводить отрицательные значения в положительные, то всё будет работать нормально.
    Хотел написать и про то, что всю арифметику, которую Steve_Stage написал для перевода "cellmin", можно заменить на "cellmax", и про то, что гораздо лучше расписать условия для отрицательных значений отдельно, но отвлёкся при написании сообщения и мысли, в итоге, смешались в кучу =\
    Последний раз редактировалось DeimoS; 21.12.2019 в 14:44.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #35
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Ну в таком случае вариант с __emit - самый быстрый из предоставленных в этом посте.

  7. #36
    Аватар для MassonNN
    Пользователь

    Статус
    Оффлайн
    Регистрация
    16.03.2018
    Адрес
    Москва
    Сообщений
    129
    Репутация:
    6 ±
    Если не прибегать к ассемблеру, то нашёл ещё вот такой способ на просторах форума по c++, который просто более быстрее подводит сравнение:


    Код HTML:
    if (n < 100000) {
                if (n < 100) {
                    if (n < 10) {
                        return 1;
                    } else {
                        return 2;
                    }
                } else {
                    if (n < 1000) {
                        return 3;
                    } else {
                        if (n < 10000) {
                            return 4;
                        } else {
                            return 5;
                        }
                    }
                }
            } else {
                if (n < 10000000) {
                    if (n < 1000000) {
                        return 6;
                    } else {
                        return 7;
                    }
                } else {
                    if (n < 100000000) {
                        return 8;
                    } else {
                        if (n < 1000000000) {
                            return 9;
                        } else {
                            return 10;
                        }
                    }
                }

  8. #37
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2590 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Хотел написать и про то, что всю арифметику, которую Steve_Stage написал для перевода "cellmin", можно заменить на "cellmax"
    Т.е. вот так?
    1. if (number < 0)
    2. {
    3. if (number == cellmin)
    4. number = cellmax;
    5. else
    6. number = -number;
    7. }

    Если да, то можно сделать ещё немного проще:
    1. if (number < 0)
    2. number = -(number + _:(number == cellmin));

    Такой трюк добавляет одну арифметическую операцию (сложение), но зато убирает лишнее ветвление и сопутствующее ему дублирование кода присваивания к переменной number. Собственно, примерно то же самое сделано и в моём варианте с __emit.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. #38
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от MassonNN Посмотреть сообщение
    Если не прибегать к ассемблеру, то нашёл ещё вот такой способ на просторах форума по c++, который просто более быстрее подводит сравнение:


    Код HTML:
    if (n < 100000) {
                if (n < 100) {
                    if (n < 10) {
                        return 1;
                    } else {
                        return 2;
                    }
                } else {
                    if (n < 1000) {
                        return 3;
                    } else {
                        if (n < 10000) {
                            return 4;
                        } else {
                            return 5;
                        }
                    }
                }
            } else {
                if (n < 10000000) {
                    if (n < 1000000) {
                        return 6;
                    } else {
                        return 7;
                    }
                } else {
                    if (n < 100000000) {
                        return 8;
                    } else {
                        if (n < 1000000000) {
                            return 9;
                        } else {
                            return 10;
                        }
                    }
                }
    Так это тот же самый вариант. Просто ветвление условий чуть другое.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  10. #39
    Аватар для vvw
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    45
    Репутация:
    9 ±
    Цитата Сообщение от MassonNN Посмотреть сообщение
    Если не прибегать к ассемблеру, то нашёл ещё вот такой способ на просторах форума по c++, который просто более быстрее подводит сравнение:


    Код HTML:
    if (n < 100000) {
                if (n < 100) {
                    if (n < 10) {
                        return 1;
                    } else {
                        return 2;
                    }
                } else {
                    if (n < 1000) {
                        return 3;
                    } else {
                        if (n < 10000) {
                            return 4;
                        } else {
                            return 5;
                        }
                    }
                }
            } else {
                if (n < 10000000) {
                    if (n < 1000000) {
                        return 6;
                    } else {
                        return 7;
                    }
                } else {
                    if (n < 100000000) {
                        return 8;
                    } else {
                        if (n < 1000000000) {
                            return 9;
                        } else {
                            return 10;
                        }
                    }
                }
    В компиляторе Pawn очень плохой оптимизатор, поэтому для реализации быстрых тривиальных функций все еще стоит использовать ассемблерные вставки. К слову, оптимизатор в этом языке может сделать удаление неиспользуемой функции, поиск блока инструкций по шаблону и замену этих инструкций на более короткие. Но стоит учесть, что интерпретатор на сервере не знает и большинства коротких инструкций.

 

 
Страница 4 из 4 ПерваяПервая ... 2 3 4

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •