Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Вопрос Навскидку (http://www.flasher.ru/forum/showthread.php?t=207647)

in4core 28.04.2014 16:15

Вопрос Навскидку
 
Делать было нечего, дело было вечером...

Зашел я как то на один англоязычный ресурс пройти тестирование по AS3 - стало интересно насколько я нуб нубистый. И вот пожалуйста навскидку вопрос *что не так в коде* :

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , if ( c == 10 ) d = false;

Мне вот интересно, скажите по честному , сколько из вас посмотрев данный код , подумав пару секунд - сразу сказали, что цикл не будет выполнен вообще? ( бесконечный ) . Каюсь - пока сам не проверил, не поверил, что это так. Да понятно - это все специфическая часть языка, но пипец такие вещи всегда помнить, хотя наверное это связано с тем, что number я редко использую в своих проектах, но все же было обидно ответить не верно на простейший код из 2х строк

alexcon314 28.04.2014 16:49

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , if ( c == 10 ) d = false;

Подумав пару секунд, я засоменевался, что это вообще скомпилится.
Изюм не только в Number, но и в , (оператор запятая).

ZackMercury 28.04.2014 16:51

Мне кажется, должно скомпилиться
Только вот так
Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )
{
        c += 0.1 ;
        if ( c >= 10 ) d = false;
}

Добавлено через 4 минуты
Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )
{
        c += 0.1 ;
        if ( c >= 10 ) d = false;
        trace(c);
}

Код:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
1.2
1.3
1.4000000000000001
1.5000000000000002
1.6000000000000003
1.7000000000000004
1.8000000000000005
1.9000000000000006
2.0000000000000004
2.1000000000000005
2.2000000000000006
2.3000000000000007
2.400000000000001
2.500000000000001
2.600000000000001
2.700000000000001
2.800000000000001
2.9000000000000012
3.0000000000000013
3.1000000000000014
3.2000000000000015
3.3000000000000016
3.4000000000000017
3.5000000000000018
3.600000000000002
3.700000000000002
3.800000000000002
3.900000000000002
4.000000000000002
4.100000000000001
4.200000000000001
4.300000000000001
4.4
4.5
4.6
4.699999999999999
4.799999999999999
4.899999999999999
4.999999999999998
5.099999999999998
5.1999999999999975
5.299999999999997
5.399999999999997
5.4999999999999964
5.599999999999996
5.699999999999996
5.799999999999995
5.899999999999995
5.999999999999995
6.099999999999994
6.199999999999994
6.299999999999994
6.399999999999993
6.499999999999993
6.5999999999999925
6.699999999999992
6.799999999999992
6.8999999999999915
6.999999999999991
7.099999999999991
7.19999999999999
7.29999999999999
7.39999999999999
7.499999999999989
7.599999999999989
7.699999999999989
7.799999999999988
7.899999999999988
7.999999999999988
8.099999999999987
8.199999999999987
8.299999999999986
8.399999999999986
8.499999999999986
8.599999999999985
8.699999999999985
8.799999999999985
8.899999999999984
8.999999999999984
9.099999999999984
9.199999999999983
9.299999999999983
9.399999999999983
9.499999999999982
9.599999999999982
9.699999999999982
9.799999999999981
9.89999999999998
9.99999999999998
10.09999999999998


alexcon314 28.04.2014 17:15

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while (  c += 0.1 , d ) if ( c >= 10 ) d = false;
trace(c);


in4core 28.04.2014 17:22

С запятой, я просто сократил, это не суть. Сама суть была в number. alexcon314 А как сдеолать так, чтобы цикл был небесконечный - проблем нет. Я именно конкретизировал суть - что помнить, что при += 0.1 будут запредельные числа никогда не достигающие целого 10

toFL 28.04.2014 17:30

Цитата:

что при += 0.1 будут запредельные числа никогда не достигающие целого 10
Это во многих языках бывает, as3 тут ни причем.

in4core 28.04.2014 17:37

Я не против. Так и никто не ответил на мой вопрос : посмотрев код ( и не читая комменты ), вы все сразу поняли, что цикл не выполнится из за того, что Number так работает, или нет ?

toFL 28.04.2014 17:46

Первое, на что обратил внимание это на символ , . Второе, что c может ровняться 10 а может и нет.

Добавлено через 4 минуты
Тут варианта два:
Код AS3:

if ( int(c) == 10 )

или
Код AS3:

if ( c == 10.0 )

В первом случае, конечно же все будет работать, но второй правильнее (если бы FPU работал честно), т.к. хороший тон сравнивать дробное с дробным.
Хотя Flash Runtime все равно оптимизирует этот код и преобразует 10.0 в 4х байтный int, а жаль. Следовательно 10.0 имеет смысл только в Java, C++ и т.п. :)

P.S. в C++ это 10.0f

Aquahawk 28.04.2014 17:52

Хорошее понимание языка это оторвать руки за такую конструкцию.

in4core 28.04.2014 18:21

Aquahawk - к чему это ты? Это вопрос теста, там могло быть написано хоть *опа* - это не важно, вопрос на знание и внимательность, а не на качество исполнения


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

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