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

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

Ответ
 
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
[Info] Почему стоит писать 2.0 вместо 2
Доказывая людям из соседней темы то, что вар не делает никакой прекалькуляции, я привел в пример дизассембленный код функции. Адольф заметил там интересную вещь, которую я тут же проверил и спешу теперь поделиться с общественностью.

Разбору подлежала следующая простенькая функция:
function fx takes real r returns real
   return 2*r*bj_PI
endfunction
что после дизассемблера вылилось в такой псевдокод:
0E41D2A8         00 00 05 03  00000e98    STUB_FUNC_BEGIN fx
0E41D2B0 fx+0000 00 01 05 08  00000252    CREATE_LOCAL_FROM_STACK r [1] {real (5)}
0E41D2B8 fx+0008 00 04 c3 0c  00000002    MOV_VAL_REG 2 => #c3 {integer (4)}
0E41D2C0 fx+0010 00 00 c3 17  00000000    #c3 = (float)#c3
0E41D2C8 fx+0018 00 00 c3 13  00000000    PUSH #c3
0E41D2D0 fx+0020 00 05 c4 0e  00000252    MOV_VAR_REG r => #c4 {real (5)}
0E41D2D8 fx+0028 00 00 c5 14  00000000    POP #c5
0E41D2E0 fx+0030 c4 c5 c5 22  00000000    #c5 = #c5 * #c4
0E41D2E8 fx+0038 00 00 c5 13  00000000    PUSH #c5
0E41D2F0 fx+0040 00 05 c6 0e  000007ed    MOV_VAR_REG bj_PI => #c6 {real (5)}
0E41D2F8 fx+0048 00 00 c7 14  00000000    POP #c7
0E41D300 fx+0050 c6 c7 c7 22  00000000    #c7 = #c7 * #c6
0E41D308 fx+0058 00 c7 00 0d  00000000    MOV_REG_REG #c7 => #00
0E41D310 fx+0060 00 00 00 27  00000000    RETURN
0E41D318 fx+0068 00 00 00 27  00000000    RETURN
0E41D320 fx+0070 00 00 00 04  00000000    STUB_FUNC_END
Адольф Обратил моё внимание на странные действия
0E41D2B8 fx+0008 00 04 c3 0c  00000002    MOV_VAL_REG 2 => #c3 {integer (4)}
0E41D2C0 fx+0010 00 00 c3 17  00000000    #c3 = (float)#c3
из чего следовало что "2" воспринимается варом как целое число, а только потом преобразовывает в число с плавающей запятой.

Чтобы проверить догадку, было внесено маленькое изменение в исходный код:
function fx takes real r returns real
   return 2.0*r*bj_PI
endfunction
и вуаля, всё как и ожидалось:
0E62D2A8         00 00 05 03  00000e98    STUB_FUNC_BEGIN fx
0E62D2B0 fx+0000 00 01 05 08  00000252    CREATE_LOCAL_FROM_STACK r [1] {real (5)}
0E62D2B8 fx+0008 00 05 c3 0c  40000000    MOV_VAL_REG 1073741824 => #c3 {real (5)}
0E62D2C0 fx+0010 00 00 c3 13  00000000    PUSH #c3
0E62D2C8 fx+0018 00 05 c4 0e  00000252    MOV_VAR_REG r => #c4 {real (5)}
0E62D2D0 fx+0020 00 00 c5 14  00000000    POP #c5
0E62D2D8 fx+0028 c4 c5 c5 22  00000000    #c5 = #c5 * #c4
0E62D2E0 fx+0030 00 00 c5 13  00000000    PUSH #c5
0E62D2E8 fx+0038 00 05 c6 0e  000007ed    MOV_VAR_REG bj_PI => #c6 {real (5)}
0E62D2F0 fx+0040 00 00 c7 14  00000000    POP #c7
0E62D2F8 fx+0048 c6 c7 c7 22  00000000    #c7 = #c7 * #c6
0E62D300 fx+0050 00 c7 00 0d  00000000    MOV_REG_REG #c7 => #00
0E62D308 fx+0058 00 00 00 27  00000000    RETURN
0E62D310 fx+0060 00 00 00 27  00000000    RETURN
0E62D318 fx+0068 00 00 00 04  00000000    STUB_FUNC_END
а конкретнее вот:
0E62D2B8 fx+0008 00 05 c3 0c  40000000    MOV_VAL_REG 1073741824 => #c3 {real (5)}
двойка сразу передалось как число с плавающей запятой

Отсюда вывод:

Значения с плавающей точкой стоит записывать с точкой даже если дробная часть нулевая (1.0 или 1. против 1)! Тем самым мы экономим виртуальной машине игры одну операцию приведения типов =)
Старый 07.10.2009, 00:06
adic3x

offline
Опыт: 108,439
Активность:
+rep
кстате я всегда ставил 2. из соображений порядка - оказалась правильно)
Старый 07.10.2009, 00:11
agentex

offline
Опыт: 34,834
Активность:
из чего следовало что "2" воспринимается варом как целое число, а только потом преобразовывает в
число с плавающей запятой.
эээ не понял вы удивлены что вар читает целое число как целое? о_О
кстате я всегда ставил 2.
ага я тож
Старый 07.10.2009, 00:11
Nekit1234007

offline
Опыт: 11,916
Активность:
agentex, считать надо в real'е, а "2" число целое, и вар преобразует его сначало в реал и потом считает. =)
Старый 07.10.2009, 08:02
Toadcop

offline
Опыт: 54,313
Активность:
ну в целом это логично как бы =) просто теперь вопрос скока требует перевод инта в флоат. (тактов процессора или чего либо =) )
Старый 07.10.2009, 11:14
adic3x

offline
Опыт: 108,439
Активность:
это я думаю к кроку вопрос. хотя можно и самим попробывать найти обработчик опкода)
но мне кажется что это (и обратное преобразование) должно быть быстрее, чем вызов нативки
Старый 07.10.2009, 11:25
NETRAT

offline
Опыт: 83,712
Активность:
r*bj_PI*2
что-то меняет?
Старый 07.10.2009, 12:02
ScorpioT1000
Работаем
offline
Опыт: отключен
Работа с интом гораздо быстей чем с флоатом, хотя здесь это не имеет значения..
че у вас за дизассемблер такой? это на асм то не похоже
Старый 07.10.2009, 12:51
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
r*bj_PI*2
что-то меняет?
нет. Всё так же берётся инт и преобразуется в флоат
Старый 07.10.2009, 13:57
agentex

offline
Опыт: 34,834
Активность:
считать надо в real'е, а "2" число целое, и вар преобразует его сначало в реал и потом считает. =)
а в чем проблема? все логично же
вы хотите сказать что если написать set i = 2 + 2 вар все равно переведет все слагаемые в риал а потом
будет считать?
Старый 07.10.2009, 14:09
Nekit1234007

offline
Опыт: 11,916
Активность:
agentex, я имел ввиду если берётся реал и инт, то инт переводится в реал и считает...
Старый 07.10.2009, 14:20
agentex

offline
Опыт: 34,834
Активность:
а что есть другие варианты?? это же очевидно..
Старый 07.10.2009, 14:23
adic3x

offline
Опыт: 108,439
Активность:
а что есть другие варианты?? это же очевидно..
это ниразу не очевидно, можно анализировать тип выражения и сразу считать цифры в формате без точки как реалы (как в принципе делают многие компиляторы)
Старый 07.10.2009, 14:46
FREEZE_ball
Cataclysm => жара
offline
Опыт: 15,247
Активность:
Код:
0.
?
Старый 07.10.2009, 15:27
iZucken
ШТО
offline
Опыт: 17,960
Активность:
FREEZE_ball, хD
ScorpioT1000:
с интом гораздо быстей чем с флоатом
а на сколько? хотя, лучше так: во сколько?
Старый 07.10.2009, 16:02
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Старый 07.10.2009, 16:10
Enein
Silenced by ZlaYa1000
offline
Опыт: 43,453
Активность:
  • .0
  • 0.
  • 0.0
как будет максимально правильно?
Старый 07.10.2009, 16:21
Van Damm
wait... what?
offline
Опыт: 22,268
Активность:
как будет максимально правильно?
любой из трёх вариантов
Van Damm добавил:
хотя насчёт первого я не уверен =)
Старый 07.10.2009, 16:25
Elf_Stratigo

offline
Опыт: 4,699
Активность:
это вроде ещё из си -неформальное преобразование...
Старый 07.10.2009, 16:58
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Elf_Stratigo, неявное приведение =)
Старый 07.10.2009, 20:39
Ответ

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

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

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

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



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