XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Extremator

offline
Опыт: 39,428
Активность:
R = 0.2 но R < 0.2
Делал триггер, и... в какой то момент понял что недосчитываюсь одного (последнего) действия
Начал проверять... упрощать... искать ошибку
Дошло до того что в первом триггере осталось только
set R = 1.00
start Timer по 0.20
а во втором по событию срабатывания таймера
set R = ( R - 0.20 )
If ( R < 0.20 ) then
stop Timer
И так триггер должен сработать 5 раз
1-й раз 1.00 - 0.20 = 0.80 а это меньше чем 0.20 ? нет...
2-й раз 0.80 - 0.20 = 0.60 а это меньше чем 0.20 ? нет...
3-й раз 0.60 - 0.20 = 0.40 а это меньше чем 0.20 ? нет...
4-й раз 0.40 - 0.20 = 0.20 а это меньше чем 0.20 ? нет... ( 0.2 не меньше 0.2 так же как и 1 не меньше 1 )
и 5-й раз 0.20 - 0.20 = 0.00 а это меньше чем 0.20 ? ДА
Но у меня триггер почему то срабатывает на 4-м такте
т.е. 0.2 меньше 0.2, и таймер останавливает сработав только 4-х раз
Я пробовал то же самое с целыми числами (от 5 и по -1) - там было всё нормально
Я проверил то же самое с реальными, но отнимал по 0.5 - там тоже было норм.
А ещё я пробывал просто установить R на 0.03 и тут же задать условие что R меньше 0.03 ,
но условие срабатывало нормально... (R не было меньше 0.03)
Что это может быть за проблема такая с сравнением чисел??
(скрин триггеров + скрин сообщения в игре (парами) )
Миниатюры
Кликните на картинку для увеличения
Название:  1.png
Просмотров: 26
Размер:  20.1 Кбайт  Кликните на картинку для увеличения
Название:  2.PNG
Просмотров: 32
Размер:  98.8 Кбайт  
Старый 30.01.2014, 13:12
Melissa
Я всегда хочу как лучше!
offline
Опыт: 31,696
Активность:
Чертовщина, й.
Делай сравнение г>=0.2-(1/1000)
Старый 30.01.2014, 14:55
ScorpioT1000
Работаем
offline
Опыт: отключен
НИКОГДА не используйте оператор "==" для чисел с плавающей точкой, если не знаете, как он работает
правильное сравнение:
bool IsRealEqu(real a, real equ) {
    return ((a > (equ-0.0001)) && (a < (equ+0.0001)))
}
ScorpioT1000 добавил:
На будущее - можете взять мою мат. библиотеку:
Старый 30.01.2014, 22:32
DioD

offline
Опыт: 45,134
Активность:
не нужны никакие библиотеки, достаточно понимать как работают числа с плавающей точкой чтобы сравнивать их грамотно.
вообще сравнивать объекты не правильно, в старших языках такая шляпа вообще не прокатывает.
Старый 31.01.2014, 04:54
ScorpioT1000
Работаем
offline
Опыт: отключен
вполне прокатывает, если реализовать оператор
Старый 31.01.2014, 05:00
Extremator

offline
Опыт: 39,428
Активность:
В общем мне хватило добавить .01 к обычному времени
и задаю я теперь не set time = 10.00, для триггерного баффа на 10 сек,
а set time = 10.01, и он срабатывает каждые 0.1 сек (по -0.10) ровно 100 раз...
не знаю что там с округлениями, но по мне - так проще...
а вообще - наверно проще было бы тоже самое поделать только с целыми числами... х)
(ниже скрин, на котором видно почему 1.00 - 0.10 меньше чем 0.9 )
Миниатюры
Кликните на картинку для увеличения
Название:  1.png
Просмотров: 4
Размер:  17.3 Кбайт  
Старый 31.01.2014, 09:42
ScorpioT1000
Работаем
offline
Опыт: отключен
Гениально.
Старый 31.01.2014, 10:44
adic3x

offline
Опыт: 108,439
Активность:
а вообще - наверно проще было бы тоже самое поделать только с целыми числами... х)
Используйте их (целочисленные) в качестве счетчиков и имейте счастье.
Старый 31.01.2014, 13:05
DioD

offline
Опыт: 45,134
Активность:
позволю себе напомнить, что никто не запрещает хранить дробную часть как целое отдельное число, очень жаль что вы на это сами не способны.
кстати драйверы и код ядра числами с плавающей точкой вообще не занимается.
Старый 31.01.2014, 17:13
ScorpioT1000
Работаем
offline
Опыт: отключен
никто не запрещает хранить дробную часть как целое отдельное число
ага и вообще на каждый регистр по переменной) а лучше хранить всю память в одной строке!
Старый 31.01.2014, 17:47
Extremator

offline
Опыт: 39,428
Активность:
DioD:
очень жаль что вы на это сами не способны
способны, но... почему тогда не в три переменных?)))
Старый 31.01.2014, 20:29
adic3x

offline
Опыт: 108,439
Активность:
позволю себе напомнить, что никто не запрещает хранить дробную часть как целое отдельное число
Никто не мешает и использовать целочисленную как дробную, но с не плавающей, а фиксированной частью.
Старый 01.02.2014, 03:02
ScorpioT1000
Работаем
offline
Опыт: отключен
Ещё как мешает. Флоат поддерживается аппаратно.
Старый 01.02.2014, 17:17
adic3x

offline
Опыт: 108,439
Активность:
Флоат поддерживается аппаратно.
int тоже поддерживается аппаратно.
Старый 01.02.2014, 20:47
DioD

offline
Опыт: 45,134
Активность:
почитали бы про это, флоуты работают в специальном режиме процессора, который надо включать-выключать что есть бред, особенно когда можно просто хранить целые числа в нужной точности.
Старый 02.02.2014, 12:26
ScorpioT1000
Работаем
offline
Опыт: отключен
ADOLF, имеется ввиду переопределения всех операций с вашими этими fixed, например 0.1 * 0.1 не эквивалентно 10 * 10
fixed только недавно начали внедрять в аппаратную часть для энтертейнмента, но в любом случае, варкрафту это не грозит
Старый 02.02.2014, 14:30
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
ScorpioT1000, 0.1 * 0.1 вполне себе эквивалентно 10 * 10, просто степень идет в обратную сторону, на самом деле.
Старый 02.02.2014, 17:12
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

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

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:42.