Можно :)
Эм... нет, не будет?
-2147483648 (cellmin) не имеет положительного представления в Pawn (т.е. -cellmin == cellmin), и поэтому первая же проверка (number < 100_000) сработает неправильно и функция выдаст 1.
Вот тебе и целочисленная арифметика... С другой стороны, в вещественных числах есть "+0" и "-0", которые с технической точки зрения имеют разное представление, но при этом считаются равными друг другу.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
DeimoS (21.12.2019)
if(number == cellmin) number = cellmax;
Я немного не так выразил мысль :) Подразумевал то, что если сравнивать именно cellmin, а не пытаться переводить отрицательные значения в положительные, то всё будет работать нормально.
Хотел написать и про то, что всю арифметику, которую Steve_Stage написал для перевода "cellmin", можно заменить на "cellmax", и про то, что гораздо лучше расписать условия для отрицательных значений отдельно, но отвлёкся при написании сообщения и мысли, в итоге, смешались в кучу =\
Последний раз редактировалось DeimoS; 21.12.2019 в 14:44.
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
Если не прибегать к ассемблеру, то нашёл ещё вот такой способ на просторах форума по 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; } } }
Т.е. вот так?
if (number < 0) { if (number == cellmin) number = cellmax; else number = -number; }
Если да, то можно сделать ещё немного проще:
if (number < 0) number = -(number + _:(number == cellmin));
Такой трюк добавляет одну арифметическую операцию (сложение), но зато убирает лишнее ветвление и сопутствующее ему дублирование кода присваивания к переменной number. Собственно, примерно то же самое сделано и в моём варианте с __emit.
Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).
Стол заказов:
Мои работы:
Связаться со мной в VK можно через личные сообщения этой группы
Заказы не принимаю
Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
Великих идей полно, на них нет спроса.
Воплощение идеи в законченную игру требует долгой работы,
таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
Предложить идею просто, воплотить – вот в чём проблема
Steve Pavlina
В компиляторе Pawn очень плохой оптимизатор, поэтому для реализации быстрых тривиальных функций все еще стоит использовать ассемблерные вставки. К слову, оптимизатор в этом языке может сделать удаление неиспользуемой функции, поиск блока инструкций по шаблону и замену этих инструкций на более короткие. Но стоит учесть, что интерпретатор на сервере не знает и большинства коротких инструкций.
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)