Как исправить сбой подсчета чисел?
|
|
Borodach | Дата: Четверг, 28 Марта 2013, 16:04:37 | Сообщение # 1 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Вот система подсчета И если передавать значение больше 150, то возвращает далеко не верное значаение. Код function AniSpeed takes integer AtSpeed,real AnSpeed returns real local integer l = 0 local real data = 0.350 local real temp = 0.350 if AtSpeed > 0 then loop set temp = data - ( temp * (0.01 * l) ) call BJDebugMsg(R2S(temp)) set l = l + 1 exitwhen l > AtSpeed endloop endif return temp endfunction Если это внутри игровая ошибка, то можно ее как то избежать?
Karamba
Сообщение отредактировал Borodach - Четверг, 28 Марта 2013, 16:07:51 |
|
|
|
VasyaBaratrum | Дата: Четверг, 28 Марта 2013, 19:58:53 | Сообщение # 2 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| функция R2S округляет real до 3 знаков
Так же стоит перевести integer " l " в real Код set temp = data - ( temp*0.01 * I2R(l) )
|
|
|
|
Borodach | Дата: Четверг, 28 Марта 2013, 20:05:19 | Сообщение # 3 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Цитата (VasyaBaratrum) функция R2S округляет real до 3 знаков На изображении можно увидеть, что это, проблему никак не решит. Цитата (VasyaBaratrum) Так же стоит перевести integer " l " в real Нет разницы будет ли l все время 1.000, 2.000, 3.000 и т.д или целочисленное 1, 2, 3
Karamba
Сообщение отредактировал Borodach - Четверг, 28 Марта 2013, 20:05:51 |
|
|
|
VasyaBaratrum | Дата: Четверг, 28 Марта 2013, 22:18:43 | Сообщение # 4 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| Цитата (Borodach) Цитата (VasyaBaratrum)функция R2S округляет real до 3 знаков На изображении можно увидеть, что это, проблему никак не решит. с помощью функции R2SW можно больше знаков отображать
Не заметил в твоей функции ошибок, аргумент AnSpeed наверно позже будешь использовать.
|
|
|
|
Borodach | Дата: Четверг, 28 Марта 2013, 22:50:37 | Сообщение # 5 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| VasyaBaratrum, AnSpeed передается как 0.350 (чтоб меньше лишнего было, сразу дал какое там число) Этих 0.350 постепенно уменьшаются.... но после AtSpeed больше 150 она начинает прыгать через раз. На скрине видно: .141 -> .142 -> .139 -> .142 и т.д, одно уменьшается другое увеличивается а должно примерно .141 -> .140 -> .140 -> .139
Karamba
Сообщение отредактировал Borodach - Четверг, 28 Марта 2013, 22:51:14 |
|
|
|
VasyaBaratrum | Дата: Четверг, 28 Марта 2013, 23:41:11 | Сообщение # 6 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| на 159 начинается то увеличение, то уменьшение. на 166 начинается чередование знаков.
да и отношение последующего результата к предыдущему колеблется, в зависимости от роста integer l. Например:
l=0 0.35/0.35=1 l=1 0.346/0.35=0.988571418 l=2 0.343/0.346=0.991329479 l=3 0.34/0.343=0.991253644 l=4 0.336/0.34=0.988235294 ... не образуется прогрессия
|
|
|
|
Borodach | Дата: Четверг, 28 Марта 2013, 23:55:09 | Сообщение # 7 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Цитата (VasyaBaratrum) да и отношение последующего результата к предыдущему колеблется, в зависимости от роста integer l Так и должно быть, ТО есть каждое последующее число уменьшается на 1% предыдущего. И я не могу понять почему почему в дальнейшем число не уменьшается на 1% предыдущего, а уменьшается то увеличивается по нарастающей.
Karamba
|
|
|
|
VasyaBaratrum | Дата: Четверг, 28 Марта 2013, 23:57:18 | Сообщение # 8 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| Цитата (Borodach) Так и должно быть, ТО есть каждое последующее число уменьшается на 1% предыдущего. а может тогда просто temp = 0.99*temp ?
|
|
|
|
Borodach | Дата: Пятница, 29 Марта 2013, 00:32:17 | Сообщение # 9 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| VasyaBaratrum, Варик по другому считает, мой вариант выдает другие значения
Добавлено (29 Марта 2013, 00:32:17) --------------------------------------------- VasyaBaratrum, Или я не правильно делаю? Код function AniSpeed takes integer AtSpeed,real AnSpeed returns real local integer l = 0 local real data = AnSpeed local real temp = data+AnSpeed*0.01 if AtSpeed > 0 then loop set temp = temp * 0.99 //set temp = data - ( temp * (0.01 * l) ) //call BJDebugMsg(R2S(temp)) set l = l + 1 exitwhen l > AtSpeed endloop endif call BJDebugMsg(R2S(temp)) return temp endfunction
Karamba
Сообщение отредактировал Borodach - Пятница, 29 Марта 2013, 08:10:14 |
|
|
|
VasyaBaratrum | Дата: Пятница, 29 Марта 2013, 12:02:40 | Сообщение # 10 |
3 уровень
Группа: Проверенные
Сообщений: 61
Награды: 0
Репутация: 15
Блокировки:
| Borodach, ну если ты хочешь, чтобы следующий результат был на 1% меньше предыдущего, то лучше всего чем вычитать
|
|
|
|
Ty3uK | Дата: Пятница, 29 Марта 2013, 19:33:24 | Сообщение # 11 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Какие значения аргументов передаешь?
|
|
|
|
Borodach | Дата: Пятница, 29 Марта 2013, 20:27:58 | Сообщение # 12 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| AnSpeed = 0.350 ( передаю ) AtSpeed = разные, в зависимости скорости атаки. Если герой поднимает "Перчатки скорости атаки +15%" то это число будет 15. И если это число превышает ~150, то дальше уже неверные значения.
Karamba
|
|
|
|
Ty3uK | Дата: Пятница, 29 Марта 2013, 20:36:29 | Сообщение # 13 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Может быть это из-за неявного преобразования l в real?
|
|
|
|
Borodach | Дата: Пятница, 29 Марта 2013, 21:18:26 | Сообщение # 14 |
9 уровень
Группа: Проверенные
Сообщений: 930
Награды: 0
Репутация: 422
Блокировки:
| Ty3uK, Перевел в реальное, то же самое.
Karamba
|
|
|
|
Ty3uK | Дата: Пятница, 29 Марта 2013, 21:42:03 | Сообщение # 15 |
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
| Я, конечно, математик еще тот, но мне кажется что вполне возможно на какой-то итерации получить отрицательное число (темп почти рекурсивно меняется в сторону увеличения).
|
|
|
|