Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вычисления и приведение численных типов в AS3 (http://www.flasher.ru/forum/showthread.php?t=114668)

romantique 05.08.2008 18:46

Вычисления и приведение численных типов в AS3
 
Сразу прошу прозения, юзал поиск, может плохо искал, но ничего вразумтиельного не нашёл.

В своём проекте очень много имею дело с математикой. В большинстве выражений присутствуют int'ы и Number'ы. И мне стало не совсем понятно, в каком порядке и как именно работают преобразования численных типов в AS3.

Я сделал пару тестов:
Код:

var a:int = 2;
var b:int = 3;
var c:int = a/b;
trace(c);

// 0

Код:

var a:int = 2;
var b:int = 3;
var c:Number = a/b;
trace(c);

// 0.6666667

Код:

var a:int = 2;
var b:int = 3;
var c:int = Math.ceil(a/b);
trace(c);

// 1

Насколько я смог уловить, сначала всё вычисления производятся в Number'ах (то есть с плавающей точкой), а поттом полученное значение приводится к тому, которое требует контекст. Поправьте если не прав.

Помогите плиз инфой, ссылками, или чем нибудь. Я хотел иметь абсолютно точную и полную схему этого процесса. Чтобы не осталось вопросов.

Xpb7 05.08.2008 19:16

Тут не надо заморачиваться. Просто нужно логически размышлять.

В 1м случае по скольку c целое число - берется его целая часть - это 0.
Во 2м все понятно, как и должно быть.
В 3м берётся потолок из 0.6 - это 1 (кстати типа Number), который отлично (в данном случае автоматически) преобразуется в int и выводится тебе.

Что тут может быть неясно?
Я бы на твоем месте больше волновался про приведение к другого рода типам.
Например помнить, что:

Код:

var c:int = Math.ceil(a/b);
trace(c); //тут происходит trace(c.toString()); автоматически


romantique 05.08.2008 19:34

Неясно например вот что. если у меня длиннющая формула, где есть куча слагаемый и множителей с типами как int так и Number. Всё это в итоге приравнивается скажем к инту. как будут происходить приведения? На каждой стадии вычисления длинного выражения, или всё вычислится так, будто там стоят Number, а только потом отбросится дробная часть?
Хотелось бы знать абсолюнто точную схему, точно такую же, как существует скажем для C++, где есть целый надор документировынных правил.

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

update:
спасибо, уже разобрался. Любое численное выражение вычисляется как Number, независмо от того, какой тип (целый, или двещественный) входящих в выражение элементов имеется. То есть для себя можно считать, что все составные части выражения идут как Number. Конечный результат приводится к тому типу, который требует контекст. Будь то lefthanded переменная, или подстановка в функцию в качестве аргумента.

Xpb7 05.08.2008 19:45

Всё предельно просто.
Код:

a = b;
Где b - это твоя огромная формула. Ты можешь в ней оперировать с чем хочешь, насувать туда что угодно. Просто потом, результат будет переведен в тот тип, которй представляет переменная a.

Rzer 05.08.2008 19:48

В большой строке все int будут заменены на Number, когда появляется необходимость. Обратно же только после присвоения переменной с типом int или после функции преобразования int()

wvxvw 05.08.2008 22:47

Опреации с целыми числами - они и есть операции с целыми числами, т.е. вас не удивляет, что
Код:

var a:Number = 3;
var b:Number = a >> 2;
trace(b);// 0

Так же точно происходят и операции с целыми числами, а класс Math по определению в методе .ceil() требует тип Number, так что он и не производит никаких операций с целыми числами, он их сразу на входе конвертирует в числа с плавающей точкой.


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

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