|
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
Устройство числовых переменных
Слышал ли кто-нибудь как во Flash пакуются числовые переменные?
Я имею в виду их бинарную структуру. Где, например, у Number порядок, а где мантиса? Тот же вопрос по поводу int. Где у него знак? |
|
|||||
Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
|
насколько помнится, все данные представлены в big endian.
А вообще, вы можете ответить на свой вопрос сами. Сделайте мини тест с байт-массивом. Запишите в него все что нужно, а потом считайте по байтам.
__________________
Загружаем картинки, минуя ошибки безопасности |
|
|||||
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,879
Записей в блоге: 7
|
Все это можно узнать в спецификации swf.
|
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
Спасибо за ответ. Проверил.
Там используется инверсная кодировка... Жаль. |
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
Хотел сделать быстрый abs, логически умножив на число из единиц не считая знакового разряда...
Для int там ещё нужно инверсию делать и прибавлять единицу. Для double - проделывать такую штуку только с мантиссой. Для int получилось. Вот: import flash.utils.ByteArray; // ============================================== var inversArr:ByteArray = new ByteArray(); inversArr[0] = 255; inversArr[1] = 255; inversArr[2] = 255; inversArr[3] = 255; inversArr.position = 0; var absArr:ByteArray = new ByteArray(); absArr[0] = 127; absArr[1] = 255; absArr[2] = 255; absArr[3] = 255; absArr.position = 0; var invMul:int = inversArr.readInt(); var absMul:int = absArr.readInt(); // ============================================== var varible:int; varible ^= invMul; varible &= absMul; varible++; // ============================================== Работает раз в сто быстрее обычного abs. Для double буду думать. Добавлено через 9 минут Да, кстати, глупо, не подумал: absMul можно считать логическим сдвигом от invMul. Добавлено через 17 минут Сравнил с обычной проверкой. Работает в десять раз быстрее неё. Добавлено через 18 минут Даже странно... Не ожидал такого. Может, что-то делаю не так... Добавлено через 48 минут Понял. Написал глупость. Это работает только для отрицательных чисел. Последний раз редактировалось semenyakinVS; 02.04.2011 в 20:33. |
|
|||||
стервочка (я мужик)
|
вот быстрый:
и только, если он в метод не обёрнут. а что касается быстрой метаматематики, то вот: http://code.google.com/p/apparat/sou...th/FastMath.as
|
|
|||||
Modus ponens
|
http://code.google.com/p/e4xu/source...mf-reader.lisp
Что касается упаковки, вот, я тут начинал писать AMF парсер, где собственно есть уже UI29 и IEEE-754. Дома у меня есть еще и на AS3 (Number не полностью реализован, без NaN, -Infinity и Infinity, но это уже проще). На счет быстродействия / оптимизации - я не берусь судить, я такой цели не ставил. EDIT: Что касается Number, то, собственно дело обстоит так (не смотря на то, что документации по IEEE стандарту куча, есть вещи которые не сразу очевидны). 1 бит - знак. 11 бит - экспонента biased на 1023 (это значит, что ее привели к положительному виду, чтобы получить ее реальное значение надо 1023 вычесть). 1 бит (который не записывается!) т.н. невидимый, или предполагаемый бит - первый бит мантиссы (мантиссу еще, даже более правильно называют сигнификандой). оставшиеся 52 бита - мантисса. Т.о. полная ширина мантиссы - 53 бита. Чтобы высчитать результат нужно: знаковый бит помножить на мантиссу разделенню на единицу сдвинутую влево на 2 в степени 52 - мантисса позиций. Т.е. знак * (мантисса / (1 << 2^(52 - мантисса))) Ну или по крайней мере мне так было удобнее всего посчитать
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 03.04.2011 в 19:48. |
|
|||||
Регистрация: Mar 2010
Сообщений: 137
|
Цитата:
По поводу сравнения... Меня это удивило, но несколько побитовых операций могут сработать быстрее сравнения Добавлено через 6 минут Дело в том, что в случаи отрицательных чисел там ещё считается дополняемый код (знаю только по-украински как он называется). Т. е. берётся (побитовая инверсия мантиссы (или порядка)) + 1. И в этом случаи так легко поменять знак не выйдет. Нужно проверять знак. Последний раз редактировалось semenyakinVS; 03.04.2011 в 20:36. Причина: Добавил про сравнение |
|
|||||
Modus ponens
|
Не, смотриете (хотя, может быть мы говорим об одном и том же, я тоже не знаю как по-русски будет bias в этом контексте). Что имеется в виду:
- экспонента записывается так, что все положительные значения будут всегда больше 1023 (заполненый первый бит). Таким образом они будут всегда больше отрицательных, если мы будем срванивать оба числа не вычисляя их значений. - отрицательные числа записываются так, что певый бит у них не заполнен, т.е. они всегда меньше либо равны 1023. Следовательно, отняв 1023 от такого числа мы всегда получим отрицательное число (либо ноль).
__________________
Hell is the possibility of sanity |
Часовой пояс GMT +4, время: 12:19. |
|
« Предыдущая тема | Следующая тема » |
Теги |
знак , оптимизация , переменные |
Опции темы | |
Опции просмотра | |
|
|