Умножение типов real
У меня есть несколько идей, почему так происходит, однако если кто-то знает наверняка - милости прошу. По-видимому, где-то возникает переполнение. Но с чего бы вдруг? Здравый смысл намекает что если точность выше нужной - порнография происходить не должна.
Элсо, начиная с точности в двойках, меньшей чем точность калькулятора винды, произведение дает нуль. Занимательная математика.

Лучший ответ:
Практически одинаково.
Мои тесты дали следующие значения в единицах процессорных тактов.
Объявление локальной переменной любого типа (при каждом вызове функции): 2700
Присваивание литерала локальной переменной любого типа: 700
Присваивание литерала глобальной переменной любого типа: 6700
Присваивание литерала элементу массива: 7500
Обращение к локальной переменной любого типа или константам true, false, null: 300
Обращение к глобальной переменной: 1300
Обращение к элементу массива: 400
Обращение к формальному параметру функции: 1000
Когда в вещественном литерале забыли поставить точку: 300
Целочисленные операции +, -, *: 600
Вещественные операции +, -: 800
Вещественная операция *: 1000
Целочисленное деление: 800
Вещественное деление: 1400
Унарный минус: 3500
Операции <, >: 1300
Операции <=, >=: 1100
Операции ==, !=: 700
Операция not: 100
Вызов пустой функции и возврат по return: 8500
Вызов пустой функции и возврат по endfunction: 9200
Передача первого значения функции: 3800
Передача каждого следующего значения функции: 1700
Возврат значения из функции: 900
loop 2 000
endloop 1 600
exitwhen true 3 300
if true then endif 2 800
if false then else endif 2 800
if not false then endif 2 900



Просмотров: 1 318

» Лучшие комментарии


IceFog #1 - 3 года назад (отредактировано ) 0
При трансляции jass скрипта в байт-код с float'ами происходит беда:
» спойлер
В скрипте В байт-коде
0.1 0.1000000089
0.11 0.1100000069
0.111 0.1110000014
0.1111 0.1111000031
0.11111 0.1111100167
0.111111 0.1111110076
0.1111111 0.1111111119
0.11111111 0.1111111119
0.111111111 0.1111111119
0.1111111111 0.7879855037
0.11111111111 -1.459007144
0.111111111111 0.7671899199
0.1111111111111 -0.9766618013
0.11111111111111 0.1111111343
0.111111111111111 -0.2006956041
0.1111111111111111 -0.6524714231
0.11111111111111111 0.4152027667
0.111111111111111111 1.395148873
0.1111111111111111111 -0.3706153929
0.11111111111111111111 -0.750297904
3.1415926535897932384626433832795 2.621956825
Sergarr #2 - 3 года назад 0
IceFog:
При трансляции jass скрипта в байт-код с float'ами происходит беда:
» спойлер
В скрипте В байт-коде
0.1 0.1000000089
0.11 0.1100000069
0.111 0.1110000014
0.1111 0.1111000031
0.11111 0.1111100167
0.111111 0.1111110076
0.1111111 0.1111111119
0.11111111 0.1111111119
0.111111111 0.1111111119
0.1111111111 0.7879855037
0.11111111111 -1.459007144
0.111111111111 0.7671899199
0.1111111111111 -0.9766618013
0.11111111111111 0.1111111343
0.111111111111111 -0.2006956041
0.1111111111111111 -0.6524714231
0.11111111111111111 0.4152027667
0.111111111111111111 1.395148873
0.1111111111111111111 -0.3706153929
0.11111111111111111111 -0.750297904
3.1415926535897932384626433832795 2.621956825
Я знал что float-ы - зло, но чтобы настолько... только integer-ы, только хардкор.
IceFog #3 - 3 года назад 0
Sergarr, достаточно не злоупотреблять количеством цифр после запятой.
nvc123 #4 - 3 года назад 0
точность больше чем 4 знака не нужна
поэтому близы ограничили размер реала
Diaboliko #5 - 3 года назад 0
Точность, быть может, и не нужна, но не одинаково ли по времени передаются эти 4 байта? Если одинаково - большая точность только на пользу же. Закрыл бы тему, но дискасс интересный
Themis #6 - 3 года назад 7

Практически одинаково.
Мои тесты дали следующие значения в единицах процессорных тактов.
Объявление локальной переменной любого типа (при каждом вызове функции): 2700
Присваивание литерала локальной переменной любого типа: 700
Присваивание литерала глобальной переменной любого типа: 6700
Присваивание литерала элементу массива: 7500
Обращение к локальной переменной любого типа или константам true, false, null: 300
Обращение к глобальной переменной: 1300
Обращение к элементу массива: 400
Обращение к формальному параметру функции: 1000
Когда в вещественном литерале забыли поставить точку: 300
Целочисленные операции +, -, *: 600
Вещественные операции +, -: 800
Вещественная операция *: 1000
Целочисленное деление: 800
Вещественное деление: 1400
Унарный минус: 3500
Операции <, >: 1300
Операции <=, >=: 1100
Операции ==, !=: 700
Операция not: 100
Вызов пустой функции и возврат по return: 8500
Вызов пустой функции и возврат по endfunction: 9200
Передача первого значения функции: 3800
Передача каждого следующего значения функции: 1700
Возврат значения из функции: 900
loop 2 000
endloop 1 600
exitwhen true 3 300
if true then endif 2 800
if false then else endif 2 800
if not false then endif 2 900