I2R

Добавлен
Нужно ли использовать эту функцию во время сравнений и мат. операций для конвертации целочисленных в числа с плавающей точкой?

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

Ок, вечером протестирую, выложу результат.
Протестировал без циклов и в разных потоках, без умножения и функции быстрее.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
17
6 лет назад
0
Сомневаюсь что округляться будет в нужную сторону, да и легче сразу real сравнивать.
0
13
6 лет назад
0
Integer наследует Real, поэтому переменную типа integer можно использовать, как real (но не наоборот).
0
28
6 лет назад
Отредактирован PT153
0
PyCCKuu_4eJl:
Сомневаюсь что округляться будет в нужную сторону, да и легче сразу real сравнивать.
Простите, а что будет округлятся у целочисленных?
Fakov:
Эм? А почему сразу real не сравнивать?
Ситуация такая. Есть число целое, есть нецелое. Мне нужно их сравнить\сложить\умножить\разделить\вычесть.
Вопрос: нужно ли конвертировать целое в нецелое с помощью I2R(), и что будет, если этого не сделать?
Я вот на HIVE читал, что I2R(int) медленнее, чем int * 1.0, но я хотел бы уточнить эту информацию и выяснить вообще необходимость конвертации как и с помощью I2R(), так и с помощью умножения на 1.0.
Пушистый:
Integer наследует Real, поэтому переменную типа integer можно использовать, как real (но не наоборот).
Нет, integer базовый тип, да и хранятся они по-разному.
0
16
6 лет назад
0
если один из операндов реал, то второе будет автоматом сконвертировано. если операнды не используют точку, то будет работать как с целыми. вызов функции дороже мат. операции.
0
28
6 лет назад
0
вызов функции дороже мат. операции.
Понятно, а зачем тогда вообще функция I2R()?
Что потребует больше времени?
local real r = 100.
local integer i = 100
local real u = r + i * 1.
// или
local real r = 100.
local integer i = 100
local real u = r + i
local real r = 100.
local integer i = 100
local boolean b = r != i * 1.
// или
local real r = 100.
local integer i = 100
local boolean b = r != i
0
16
6 лет назад
0
Ну просто функция - это официальный вариант, а можно перемножить
Затраты времени в мат операциях ничтожны по определению
0
28
6 лет назад
0
Ну просто функция - это официальный вариант, а можно перемножить
Нужно ли вообще перемножать?
Что потребует больше времени?
local real r = 100.
local integer i = 100
local real u = r + i * 1.
// или
local real r = 100.
local integer i = 100
local real u = r + i
local real r = 100.
local integer i = 100
local boolean b = r != i * 1.
// или
local real r = 100.
local integer i = 100
local boolean b = r != i
0
20
6 лет назад
0
Жасс расходует время на чтение символов (на хайве видел 5мс на сисвол, но, вероятно, имелось в виду мкс или типа того, ибо иначе выходит больно жирно, не уверен. Расходуется больше времени на чтение чем на подобные мелкие операции. Но делать сильно крутую оптимизацию стоит лишь для циклов, групп юнитов и т.п. Не лагает - забей. Хотя имеет смысл научиться сразу все делатб по человечески, да :)
0
17
6 лет назад
0
Diaboliko, Поделитесь ссылочкой, если осталась? :3
0
20
6 лет назад
0
там на форуме что то со словом lab в качестве подфорума. Я пока не у компа
Там всякие перформанс обсуждения
0
28
6 лет назад
Отредактирован PT153
0
Тестировал время с помощью файла, который дал мне DracoL1ch. Кому нужно, могу кинуть в ЛС.
Без умножения и I2R() вышло быстрее.
Код, которым тестировал
function Trig takes nothing returns nothing
    local real r = 1.
    local integer i = 1
    local integer a = 1
    call ClearTextMessages()
    call StartPerfCounter()
    call DebugMsg("BEGIN!!!")
    call StopPerfCounter()
    call DebugMsg("Non convert")
    call StartPerfCounter()
    loop
        set r = r - i
        set a = a + 1
        exitwhen a == 1000
    endloop
    call StopPerfCounter()
    
    call DebugMsg("*1.")
    set a = 1
    call StartPerfCounter()
    loop
        set r = r - i * 1.
        set a = a + 1
        exitwhen a == 1000
    endloop
    call StopPerfCounter()
    
    call DebugMsg("I2R")
    set a = 1
    call StartPerfCounter()
    loop
        set r = r - I2R(i)
        set a = a + 1
        exitwhen a == 1000
    endloop
    call StopPerfCounter()
endfunction

function InitTrig_I2R_test takes nothing returns nothing
    set gg_trg_I2R_test = CreateTrigger(  )
    call TriggerRegisterTimerEvent( gg_trg_I2R_test, 5, true)
    call TriggerAddAction( gg_trg_I2R_test, function Trig )
endfunction
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.