Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Замена Number int и uint. (http://www.flasher.ru/forum/showthread.php?t=210085)

ZackMercury 25.01.2015 18:20

Замена Number uint.
 
Я тут подумал, и снова подумал, и пришёл к мысли, что вычисления с плавающей запятой довольно абстрактны и неточны. Но что, если попробовать вырваться из этого "волнистого" "приблизительно равно"?

Итак, в чём суть. Определить на уровне пакета ассоц. массив юинтов, которые будут хранить значения от 0 до единицы пропорционально uint от 0 до uint.MAX_VALUE(типа обычной дроби вместо десятичной), и вместо переменных, доставать значения по ключу в юинтах.

И при вычислениях делить на uint.MAX_VALUE для получения значения с плавающей запятой(например, для скейла), хотя, думаю, лучше вместо скейла дёргать ширину, для получения найточнейшего результата.
В итоге мы получаем обычную дробь, и операции можем производить исключительно с числителем.
Но разве это нам мешает вычислять, к примеру, положение объекта внутри другого объекта, и делать относительные итерации числителя(например, перемещение на 10 процентов -

Код AS3:

vars.movement += uint.MAX_VALUE / 10;

при этом замечательную особенность обнаружил, когда попытался сделать следующее:

Код AS3:

var somevar:uint = uint.MAX_VALUE + 1;
trace(somevar); //0

Код AS3:

var somevar:uint = uint.MAX_VALUE + 2;
trace(somevar); //1

Код AS3:

var somevar:uint = uint.MAX_VALUE + 3;
trace(somevar); //2

Выходит, за границы объекта мы выйти не сможем никак!
Я почти уверен, что сейчас придёт nubideus и разочарует меня.
А теперь вопрос - почему не использовать инты и не проводить все вычисления с подобными дробями?

Единственное, что я заметил -
Код AS3:

var somevar:uint = -1;
trace(somevar); // выдаёт число uint.MAX_VALUE, НО бросает варнинг. Почти уверен, вылазит ошибка. Это так?

Если это так, то это превратит весь код в набор трай-кетчей, дабы предотвратить выброс ошибок...

in4core 25.01.2015 18:56

uint - это число от 0 и выше. Если ты задаешь ему -1, то оно превратиться в 4294967295

ZackMercury 25.01.2015 18:59

Цитата:

Сообщение от in4core (Сообщение 1177993)
uint - это число от 0 и выше. Если ты задаешь ему -1, то оно превратиться в 4294967295

Разумеется, именно это и хорошо, когда элемент достигнет края экрана и попытается его перешагнуть(от значения отнимется другое) он окажется с другой стороны.
Но мне не нравится варнинг, который мне бросил FD:

Код:

C:\Users\SuriTheAngel\Documents\DragonWorld\src\com\dragonworld\Main.as(95): col: 8 Warning: Negative value used where a uint (non-negative) value is expected.
Не возникнет ли ошибки в рантайме?

UPD:
Ага... разобрался. Варнинг не бросается, если делать вот так
Код AS3:

var somevar:uint = 0;
somevar --;
trace(somevar);//4294967295 ( == uint.MAX_VALUE)

Отлично, в таком случае дайте мне повод, чтобы не использовать подобную систему.

Добавлено через 43 минуты
Конечно, это первое, что пришло в голову, однако если у вас есть свои варианты, предлагайте :)

Tails 25.01.2015 23:08

Есть такой класс - Math
И у него есть несколько интересных методов:
Код AS3:

Math.round(player.x); // Целое округлённое
Math.floor(player.x); // Целое без дробной
Math.min(sceneWidth, player.x); // Не уйти за правый экран
Math.max(0, player.x); // Не уйти за левый экран


ZackMercury 26.01.2015 00:29

Tails, замечательно выходит.
Я не раз слышал о погрешностях чисел с плавающей запятой.
И все советовали использовать int для вычислений, где нужна точность.
Но я вот не могу придумать, как сделать универсальное решение...

nubideus 26.01.2015 14:42

Цитата:

вычисления с плавающей запятой довольно абстрактны и неточны
Цитата:

И все советовали использовать int для вычислений, где нужна точность.
ой это такой вздор, double(Number) - 64 бита, int - 32 бита.

Цитата:

замечательную особенность
называется переполнение типа
Цитата:

var somevar:uint = -1;
uint(-1) или -1 >>> 0 - называется явное и неявное приведение типа

Цитата:

почему не использовать инты и не проводить все вычисления с подобными дробями?
Цитата:

дайте мне повод, чтобы не использовать подобную систему
заменив double на int точность может только уменьшиться, а код запутаться.

SuriTheAngel, а зачем тебе?

ZackMercury 26.01.2015 23:10

Цитата:

SuriTheAngel, а зачем тебе?
Стремление к идеальному. Не понимаю, ведь уже какое поколение компьютеров, а до сих пор есть какая-то неточность в рассчётах. Или рассчёты станут идеально точными только на квантовом писи?

Ну, а вдруг мне придёт в голову моделировать физику(не механику движения, а именно физику), ну там к примеру, мне уже пришло в голову моделировать молекулярные структуры для развлечения.
Хочу закрепить школьный материал таким образом)

Поэтому неточность и погрешность мне не даёт покоя.

СлаваRa 27.01.2015 01:24

Вы решаете надуманную несуществующую проблему?

ZackMercury 27.01.2015 02:07

Цитата:

Сообщение от СлаваRa (Сообщение 1178051)
Вы решаете надуманную несуществующую проблему?

Да что-то с программированием в последнее время ваще нет проблем, вот и решил решить себе надуманную проблему... Нет, скорее задачу.
А ещё точнее, я хотел услышать, что думают другие по этому поводу. Вдруг, до меня придумали какое-то решение.

Ну окей, раз все пользуются Number и всем норм - то выходит, что задача действительно надуманная.
Спасибо всем за ответы.

nubideus 27.01.2015 09:47

Цитата:

надуманную несуществующую проблему
деньги не считают в double потому что так прикольней?

SuriTheAngel, ну допустим будут у тебя более точные числа. есть другая проблема - время.
в копутерах можно скалькулировать только одно конкретное состояние одновременно, т.е. фрагментами. а в реальности все идет с бесконечной плавностью.

делай нейросети


Часовой пояс GMT +4, время: 16:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.