Добавлен map_maiker
Почему-то данная функция выдаёт слишком много опыта:
function ExpBoost_Actions takes nothing returns nothing
local unit u = GetTriggerUnit()
local unit h = GetKillingUnit()
local integer exp = R2I(Pow(10, 1+GetUnitLevel(u) - GetUnitLevel(h)))
local texttag tt
call BJDebugMsg(I2S(exp))
if exp < 1 then
set exp = 1
endif
if exp >= 15000000 then
set exp = 15000000
endif
call BJDebugMsg(I2S(exp))
set tt = CreateTextTagLocBJ( "+"+I2S(exp)+" exp", GetUnitLoc(GetTriggerUnit()), 0, 10, 0.00, 0.00, 100, 0 )
if ebt1 then
call UnitAddItemByIdSwapped(0x49303548,h)
set ebt1 = false
endif
call AddHeroXP(h, exp, false)
call SetTextTagVelocityBJ( tt, 64, 70 )
call SetTextTagLifespanBJ( tt, 3 )
call SetTextTagPermanentBJ( tt, false )
call ShowTextTagForceBJ( true, tt, GetPlayersAll() )
set u = null
set h = null
endfunction
Уточню, при превосходстве уровня героя над уровнем убитого юнита она должна выдавать 1 опыта, а выдаёт 15000000. Более того, до урезания опыта она и вовсе выдаёт что-то в районе 2^32. Полагаю, дело в переполнении, но это всё равно очень странно. Ведь значения должны быть около нуля, 10^(-100).
Да, мне интересно почему такое происходит, а варианты с обходом этого бага вроде есть. Например, поставить условия до возведения в степень, для ограничения значений.
Принятый ответ
Не уверен на счёт "больше", так как проблема в таких значениях когда уровень убитого сильно меньше.
Ну так если у убийцы уровень больше, то у убитого уровень меньше, ваш кеп. Конкретные примеры будут?
Увидел.10^(-100)
Ну так а что вы хотите-то.
local real r = Pow(10, -100 )
call DisplayTextToForce( GetPlayersAll(), R2SW(r, 0, -1))
call DisplayTextToForce( GetPlayersAll(), I2S(R2I(r)))
local real r
local integer power = -100
loop
set r = Pow(10, power)
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0., 0., 5., "r = " + R2SW(r, 0, -1) + ", power = " + I2S(power))
exitwhen 0 < r and r < 1
set power = power + 1
endloop
Согласно этому, наименьшее положительное число равно 1.17549435e-38. 10^-38 меньше, потому выходит 0. 10^-37 больше, потому цикл остановился. Выведен 0, потому что больше 9 знаков после запятой вар выводить не умеет.
Нужно ещё понимать, что максимальное возможное число равно 3.40282346639e+38, а нам выводится 1.7014144e+40. Одним словом, происходит какая-то непостижимая жесть.
Нужно ещё понимать, что максимальное возможное число равно 3.40282346639e+38, а нам выводится 1.7014144e+40. Одним словом, происходит какая-то непостижимая жесть.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован map_maiker
rsfghd: Я же написал, что знаю как обойти. Мне интересно почему так происходит.
Так-то я сделал примерно как ты сказал:
Отредактирован rsfghd
rsfghd: Эм... Это-то так, но я возвожу 10 в отрицательную степень. Это эквивалентно делению 1 на 10 в положительной степени. 10^-x = 1/(10^x)
Отредактирован rsfghd
Отредактирован PT153
Ну так а что вы хотите-то.
Нужно ещё понимать, что максимальное возможное число равно 3.40282346639e+38, а нам выводится 1.7014144e+40. Одним словом, происходит какая-то непостижимая жесть.
quq_CCCP: Да просто долго качаться со стандартными формулами.