Решил потестировать Wait на 0.00 секунд, а то вдруг какой-то сделает минимальную задержку, которая нужна для реального нанесения урона после срабатывания соответствующего события, либо приведения способности в действие. Но в очередной раз столкнулся с проблемой, которая в практическом смысле для меня ранее роли никакой не играла, но теперь просто хочется разобраться на всякий случай. Проблема в том, что не срабатывает для реальной переменной значение равно, когда ставлю меньше. Вот триггер:
По идее он должен досчитать на экране до 0.100 и остановиться, но он считает всякий раз до 0.110. Почему, ведь в условии указано, что считать дальше только при значении меньше 0.100, а не меньше или равно?
И TriggerSleepAction, и PolledWait минимально выдают 0.10 секунд при всех значениях меньше, но PolledWait при значении 0.00 выдаёт нулевую задержку, за время которой действие не успевает произойти. Если заглянуть в Function list, то там указано, что для всех значений больше 0 сделать то-то. Вот в этом случае больше корректно работает, а не как больше или равно.

Принятый ответ

PT153:
Потому что число 0.01, сложенное 10 раз, меньше 0.1.
Выводи число следующим кодом, где r - твоё real число.
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., R2SW(r, 0, -1))
PT153:
у парня проблемы с алгоритмом, в какой вселенной 0.01 * 10 не 0.1?
В компьютерной. И да, 0.01 * 10 тоже может быть не равно 0.01 + ... + 0.01. Потому что складываются и умножаются real по-разному.
Hate, надо просто использовать целочисленные, или пользоваться ==, в JASS == округляет числа для сравнения (!= не округляет).

Пороверил разные варианты, сразу упомяну, что с целочисленными всё огонь, просто какие-то другие воспоминания с ними всплывали.
PT153, сначала не понял, зачем мне твоя строчка, она всего лишь выдавала 0.1 вместо 0.100, но тестировал разные варианты и всё прояснилось. Если задавать шаг 1.0, то всё исправно считается до 10.0, если задавать шаг 0.2, то всё считается до 2.2 и отображается ровно, но если сделать шаг 1.01, то вот тут и появляется то, ради чего ты эту строчку дал.
Именно с дробной частью косяк, и теперь не знаю как выбрать лучший ответ, по идее у тебя в каждом комментарии полезная информация. Просто объединил их в итоге.

Hate:
сначала прибавляет, а затем проверяет, потом удивляется почему 0.11
Обычно просто отшучиваюсь на подобные комментарии, но сейчас так всё грустно в нём, что не смогу.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
24
5 лет назад
0
Выглядит как типичная проблема ограниченной точности дробных чисел.
0
26
5 лет назад
0
Не хочу сейчас проверять, потому что уже поздно, только вроде бы и с целочисленными так.
Утром посмотрю.
0
28
5 лет назад
0
Потому что число 0.01, сложенное 10 раз, меньше 0.1.
0
26
5 лет назад
0
сначала прибавляет, а затем проверяет, потом удивляется почему 0.11
0
28
5 лет назад
0
Выводи число следующим кодом, где r - твоё real число.
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., R2SW(r, 0, -1))
0
26
5 лет назад
0
PT153:
Потому что число 0.01, сложенное 10 раз, меньше 0.1.
у парня проблемы с алгоритмом, в какой вселенной 0.01 * 10 не 0.1?
0
28
5 лет назад
Отредактирован PT153
0
сначала прибавляет, а затем проверяет, потом удивляется почему 0.11
Нет. После сложения будет 0.1, на экран выведется 0.1, потом будет проверка, что 0.1 не меньше 0.1. Тут дело исключительно в числах с плавающей точкой.
у парня проблемы с алгоритмом, в какой вселенной 0.01 * 10 не 0.1?
В компьютерной. И да, 0.01 * 10 тоже может быть не равно 0.01 + ... + 0.01. Потому что складываются и умножаются real по-разному.
0
26
5 лет назад
0
а если наоборот, от 0.1 отнимать по 0.01? и условие что r > 0.
0
28
5 лет назад
0
Hate, надо просто использовать целочисленные, или пользоваться ==, в JASS == округляет числа для сравнения (!= не округляет).
0
26
5 лет назад
Отредактирован 8gabriel8
0
PT153:
Потому что число 0.01, сложенное 10 раз, меньше 0.1.
Выводи число следующим кодом, где r - твоё real число.
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., R2SW(r, 0, -1))
PT153:
у парня проблемы с алгоритмом, в какой вселенной 0.01 * 10 не 0.1?
В компьютерной. И да, 0.01 * 10 тоже может быть не равно 0.01 + ... + 0.01. Потому что складываются и умножаются real по-разному.
Hate, надо просто использовать целочисленные, или пользоваться ==, в JASS == округляет числа для сравнения (!= не округляет).

Пороверил разные варианты, сразу упомяну, что с целочисленными всё огонь, просто какие-то другие воспоминания с ними всплывали.
PT153, сначала не понял, зачем мне твоя строчка, она всего лишь выдавала 0.1 вместо 0.100, но тестировал разные варианты и всё прояснилось. Если задавать шаг 1.0, то всё исправно считается до 10.0, если задавать шаг 0.2, то всё считается до 2.2 и отображается ровно, но если сделать шаг 1.01, то вот тут и появляется то, ради чего ты эту строчку дал.
Именно с дробной частью косяк, и теперь не знаю как выбрать лучший ответ, по идее у тебя в каждом комментарии полезная информация. Просто объединил их в итоге.

Hate:
сначала прибавляет, а затем проверяет, потом удивляется почему 0.11
Обычно просто отшучиваюсь на подобные комментарии, но сейчас так всё грустно в нём, что не смогу.
Загруженные файлы
Принятый ответ
2
28
5 лет назад
Отредактирован PT153
2
по идее у тебя в каждом комментарии полезная информация.
Это должен был быть 1 комментарий, просто я с Hate одновременно писал.
R2SW(r, 0, -1) я вынес в отдельную функцию, назвал её R2SX.
function R2SX takes real r returns string
    return R2SW(r, 0, -1)
endfunction
Не показывает лишние нули, но если знаков после запятой больше 6, математически округляет до 6-го знака после запятой. Для таких чисел лучше использовать R2SW(r, 0, 9). Больше 9 знаков после запятой R2SW не показывает (и всегда есть хотя бы 1 знак после запятой).
Чтобы оставить комментарий, пожалуйста, войдите на сайт.