Перейти к контенту

Справочник по функциям и классам


Рекомендуемые сообщения

Действительно - :good2: - можно писать любые числа - они в роде как пересчитываются в правильные (?) ...

Но! - вот, например, новогодняя аномалия, "32 декабря" называется:

 

(далее: если "set" ... -> то "get" ...)

 

2014,12,32,0,0,0,0 -> 2014,12,32,0,0,0,0

2015,1,1,0,0,0,0 -> 2014,12,32,0,0,0,0

2014,12,33,0,0,0,0 -> 2015,1,2,0,0,0,0

Изменено пользователем 7.9

всё легко

Ссылка на комментарий

7.9,

  Цитата
А даты-время, этот класс, обслуживает в пределах с 2000.1.1.0.0.0.0 по 2029.12.31.23.59.59.999

Вроде как с 1/1/1, а не с 2000/1/1. И эта дата + нулевое время соответствует нулевому значению счётчика. Соответственно, если прибавить или отнять такое время (1/1/1-0:0:0:0), то ничего не изменится.

 

  Цитата
Но! - вот, например, новогодняя аномалия, "32 декабря" называется:

Я провёл глобальное сравнение с настоящим календарём. Да, в конце каждого года непременно косяк. Чаще всего в самом деле появляется 32-е декабря. При этом иногда это просто лишний день, иногда он заменяет 1-е января следующего года (а год начинается соответственно со 2-го числа). А иногда косяк не в лишнем дне, а напротив - в отсутствии 31-го декабря.

 

В общем, даже календарь в Зоне аномальный =) Интересно, баг это или пасхалка...

 

  Полезный утиль (Показать)
Ссылка на комментарий

Думаю писали именно 31 января, поэтому и под алкоголем сместилось.... ))))))

А в общем, можно нагородить отдельную проверку с ручным выставлением в случае с 31 январем....

 
(получения дня == 31) and функция or обычная функция. 
-----
if день == 31 then 
код функции 
else 
код функции 
end

Ну к примеру.. А в сете выставить полную дату, ручками....

 

ХЗ, эти великие отмазывальщики, скажут все что угодно.. Но не признаются в кривых руках, и безмозглостью ....

Изменено пользователем Unnamed Black Wolf
Ссылка на комментарий

Unnamed Black Wolf,

в сущности какая разница, соответствует игровой календарь реальному или нет? Ведь игровое время по-любому отличается от реального. Ну будет в игре лишний/недостающий день, и что с того? Надо только убедиться, что способ расчёта даты в классе CTime соответствует расчёту времени в собственно игровом времени.

  Полезный утиль (Показать)
Ссылка на комментарий

malandrinus, какой ты скучный.. Нет, покритиковать немного.. Повеселится над багом/пасхалкой.... Я вот к примеру до второго третьего, в отключке.. Поэтому не знаю что есть 32 или нет.. Мб календарь в действительности почему-то имеет странные 31-30 дней и за редкостью 29 и в обычностью 28.... А у меня в НГ чудо.

Обидел речью про криворукость и безмоглость? (Как будто сам так не считаешь....)

Ну кстати смотря чем мерить время в сталке, если мне память не изменяет, то в сталке есть и запрос обычного времени.. Которое яко-бы реальное....

Суть вопроса, а что есть реальное? Почему к примеру это все не игра? То так буит весело..... (Бушь отвечать, аргументируй.. Я сперва начну. (Реинкорнация и перерождение это вид сейв/лоад))

Ссылка на комментарий

Темы про общие вопросы программирования не нашёл - спрошу здесь:

 

Почему у меня получаются такие результаты:

8388608 + 2.555 - 8388608 = 3 ;

0.123456789 * 1000 / 1000 = 0.1234567835927 ?

 

В документации написано, что числа в Луа "с плавающей точкой и двойной точности".

Что сделать что-бы так не было? Почему предел 2^23?

 

 

 

 

===========================

 

ЗЫ:

Unnamed Black Wolf

  Цитата
по самому луа, у меня все в порядке выдает....

Я про Луа в Сталкере имел в виду.

Изменено пользователем 7.9

всё легко

Ссылка на комментарий

Доброго всем времени суток.

  7.9 писал(а):
Почему у меня получаются такие результаты:

8388608 + 2.555 - 8388608 = 3 ;

Смахивает на округление. Попробуйте заменить 2.555 на 2.355.

Получится 2?

 

  7.9 писал(а):
0.123456789 * 1000 / 1000 = 0.1234567835927 ?

Похожие баги я встречал у компиляторов Си, первой половины 80-х, и у SuperCalc-а (был такой предок у Exel).

 

  7.9 писал(а):
В документации написано, что числа в Луа "с плавающей точкой и двойной точности".

Что сделать что-бы так не было? Почему предел 2^23?

Не понял, что не так? 2^23 не нравится? А почему?

 

Ссылка на комментарий

для AK74

Понятно, что всё это - округление, только вот - не ожидал я его так быстро. Было-бы 2^25 - я бы может ничего и не заметил. Числа двойной точности с плавающей точкой - это 15 (или 16?) десятичных разрядов, а тут... даже не половина.В принципе - не проблема - пока обошёлся...

Изменено пользователем 7.9

всё легко

Ссылка на комментарий

А вот тут уже я завис, что значит "округление, только вот - не ожидал я его так быстро"?

Поясните, плз.

По идеи, округление "наступает" тогда, когда Вы его вызываете в явном или не явном виде.

 

ЗЫ. Вообще-то мне тоже показалась странным такой формат представления чисел, ведь по идеи

двойная точность раньше была: 1 знаковый бит, 11 бит -экспонента и 52 бита - мантиса, если склероз меня не подводит.

 

Ссылка на комментарий
  AK74 писал(а):
... что значит "округление, только вот - не ожидал я его так быстро"? Поясните, плз.

Просто, я его (автоматического округления) вообще не ожидал - если-бы была двойная точность, как в стандарте, я бы никогда с этим не столкнулся. Я думал: в XRay-е стандартный формат числа Луа, оказалось - это не так.

 

ЗЫ:

Наверное для производительности разрядность порезали.

Изменено пользователем 7.9

всё легко

Ссылка на комментарий

Не знаю как Луа, но некоторые компиляторы C, допускали когда результат вычисления с плавающей точкой передавался целочисленной переменной, без вызова дополнительных функций преобразования форматов.

При этом, компилятор сам генерировал код, отбрасывающий дробную часть числа, перед присваиванием.

Может и здесь так же?

Ссылка на комментарий

AK74, "код, отбрасывающий дробную часть числа" это и есть преобразование форматов.

 

Добавлено через 1 мин.:

Кстати интересно - читал я, что все числа в ЛУА - double, но каким тогда образом отрабатывают циклы?

Видимо есть таки целые.Должны быть.

Ссылка на комментарий

2 Monnoroch

А где я говорил обратное?

Я говорил о том, что преобразование типов данных может быть явным(Паскаль/Делфи), и может быть не явным (в PHP можно значение можно присвоить и вовсе строковой переменной).

 

Что касается double в циклах, если каждый раз происходит изврат с преобразование типов данных, да еще в нестандартный для сопроцессора формат, а потом из него уже в стандартный double, потом инкремент, а потом обратно преобразования!

Не-е-е-е, вряд ли, ну не дебилы же они.

Тут в чем-то другом собака порылась. :)

Ссылка на комментарий

Ох, развели флуд в теме...

 

Сначала по CTime. На самом деле совершенно фиолетово, правильно ли он считает даты или нет по совершенно банальной причине. В сталкере время не может быть больше чем стартовое время + 2^32 миллисекунд, что соответствует примерно 49 дням. По истечении этого времени счётчик отмотается на ноль и время изменится на стартовое. Дата никогда не дойдет до проблемного конца 12-го месяца.

 

Теперь по числам. Выглядит так, что в сталкере разработчики изменили дефолтовое представление чисел с double на float. Прежде чем паниковать давайте разберёмся немного в основах.

 

Во-первых, а что собственно плохого в использовании числа с плавающей запятой (в смысле, что плохого в использовании его как универсального типа "для всего")? Разработчики Lua и здесь не отошли от принципа "ничего лишнего". Может они переусердствовали?

 

К примеру, бытует следующее правило - числа с плавающей запятой нельзя сравнивать на равенство. Это верно, спорить не буду, но с некоторыми оговорками. Почему, собственно, нельзя? Ответ - из-за ошибок округления. Ну а если их нет? Число с плавающей запятой содержит в себе как подмножество некоторый непрерывный диапазон целых чисел (т.е. подмножество целых чисел, которые могут быть представлены этим типом гораздо больше, чем этот диапазон, но за пределами диапазона между числами уже будут разрывы, и корректность целочисленных сложений будет нарушена). Пока мы ведём вычисления в пределах этого диапазона и не используем операций, которые могут привести к появлению дробных чисел (деление, к примеру), то число будет оставаться целым, информация теряться не будет и в частности не будет никаких проблем с точным сравнением чисел на равенство.

 

Диапазон этот определяется размером мантиссы и не столь уж он и маленький. В частности у double мантисса занимает 52 бита + знаковый бит, т.е. в сумме 53 бита. Это, между прочим, позволяет представить больше целых чисел, нежели обычным типом int языка C/C++, в котором на большинстве архитектур 32 бита. Да, при выходе за этот диапазон арифметика ведёт себя не так, как целочисленная арифметика СИ. Ну и что? Не выходите за диапазон и всё. При выходе за допустимый диапазон любая машинная арифметика будет вести себя ненормально. То, что мы привыкли к одному способу ненормальности не означает, что так должно быть везде. Все прочие особенности и ограничения, связанные с этим представлением, также не вызывают особенных проблем. Как правило, в скриптовых языках применение целых типов ограничено всевозможными счётчиками в циклах и подсчётом количества чего-либо. Операция деления при этом является попросту излишней. Если вдруг до зарезу надо, то просто не забудьте про необходимость использовать явно функцию округления. Дело привычки опять же.

 

Второй вопрос, насколько плохо урезание дефолтового типа с double до float? Оценим без лишних эмоций. Тип float имеет мантиссу в 23 бита + 1 знаковый. Диапазон целых чисел, которые могут храниться без потери точности составляет +/- 16777216 (16 миллионов).

Давайте вспомним, что в игре может существовать всего 65534 объекта. И даже количество вертексов уровня (самая многочисленная сущность в игре) не превышает обычно полутора-двух миллионов. Так что с учётом тех потребностей, которые обычно возникают в скриптовании в этой игре, тип float выглядит вполне достаточным. По скорости же работы float на 32-х разрядной архитектуре существенно быстрее, чем double. С точки зрения собственно вычислений с плавающей запятой, то тут тоже всё нормально. В игровой математике нет необходимости в повышенной точности, зато есть необходимость в скорости. Ну и про память не забываем.

 

Теперь я кстати понял, почему у меня возникали проблемы со старшими битами при использовании функций побитовых операций (bit_and, bit_or, bit_xor). Сами то функции работают нормально, но вот маску можно задать не любую. Хотя опять же, в игре не используются флажки разрядности больше 16 бит, так что и с этим проблем никаких.

  Полезный утиль (Показать)
Ссылка на комментарий

Завершаем диалоги. В последней части подробно рассмотрены функции и методы, так или иначе относящиеся к диалогам: инициирование, завершение, блокирование/разблокирование и т.д.

 

  Диалоги. Часть 3 (Показать)

 

  Дополнение о создании динамических диалогов (Показать)

 

Изменено пользователем Kirgudu
  Полезный утиль (Показать)
Ссылка на комментарий
  Классы fcolor и color_animator (Показать)

 

Изменено пользователем Kirgudu
  Полезный утиль (Показать)
Ссылка на комментарий
malandrinus, есть ли связь между story_ids из lua_help.script и game_story_ids.ltx из папки config? Если есть, то какая? По идее, достаточно задать нужный sid в game_story_ids.ltx, но...
Цензура ограничивает творчество © by me
Ссылка на комментарий

dimos,

связь самая непосредственная. Естественно, надо прописать story_id в game_story_ids.ltx, и после этого он появляется под прописанным именем в классе story_ids. Через этот класс-перечисление можно обращаться к новому story_id по имени, а не использовать малопонятную цифру.

  Полезный утиль (Показать)
Ссылка на комментарий
  Колбек на заход на уровень. (Показать)
  • Полезно 2
  Полезный утиль (Показать)
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...