Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 28.08.2012, 16:44
sospamom вне форума Посмотреть профиль Отправить личное сообщение для sospamom Найти все сообщения от sospamom
  № 1  
Ответить с цитированием
sospamom

Регистрация: Jun 2008
Сообщений: 126
По умолчанию Number изменяется на 0.999999999999999

Здравствуйте.
Прибавляю к переменной типа Number, число [0.1]. В результате иногда прибавляется [0.1], а иногда [0.999999999999999]. Тоже самое с уменьшением.
Пример кода:
Код AS3:
package {
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
 
	public class Main extends Sprite {
 
		public function Main () 
		{
			_volume = 0.5;
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
		}
 
		private function keyDown(e:KeyboardEvent):void 
		{
			if (e.keyCode==37) 
			{
				if (_volume != 1)
				{
					_volume += 0.1;
					trace(_volume);
				}
			}
			else if (e.keyCode==39)
			{
				if (_volume != 0)
				{
					_volume -= 0.1;
					trace(_volume)
				}
			}
		}
 
		private var _volume:Number;
	}
}
Пример вывода:
Код:
0.4
0.30000000000000004
0.20000000000000004
0.10000000000000003
2.7755575615628914e-17
0.10000000000000003
0.20000000000000004
0.30000000000000004
0.20000000000000004

Старый 28.08.2012, 16:47
Krusty вне форума Посмотреть профиль Отправить личное сообщение для Krusty Найти все сообщения от Krusty
  № 2  
Ответить с цитированием
Krusty

Регистрация: Jul 2007
Сообщений: 393
Это совершенно нормальное поведение.

Старый 28.08.2012, 16:47
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 3  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Все нормально, это вещественные числа. В компутере всегда так.

Старый 28.08.2012, 16:49
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Числа в компьютере хранятся в двоичной системе счисления. В ней 0.1 - бесконечная периодическая дробь (как 1/3 = 0.333333... в десятичной). И так же, как при сложении и вычитании 0.3333333333 в десятичной вы бы не получали точные числа в десятичной (там ещё и последний знак округляется) - так же вы их не получаете проводя вычисления в двоичной.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

Старый 29.08.2012, 01:16
Aquahawk вне форума Посмотреть профиль Отправить личное сообщение для Aquahawk Посетить домашнюю страницу Aquahawk Найти все сообщения от Aquahawk
  № 5  
Ответить с цитированием
Aquahawk
 
Аватар для Aquahawk

Регистрация: Nov 2010
Адрес: Москва
Сообщений: 915
Записей в блоге: 4
Отправить сообщение для Aquahawk с помощью ICQ Отправить сообщение для Aquahawk с помощью Skype™
http://habrahabr.ru/post/112953/ http://habrahabr.ru/post/130272/ Такое поведение не просто есть, а оно строго регламентировано стандартом, имя ему IEEE 754. И на самом деле, процессор даже ему не следует обычно, но делает что-то похожее. Чтобы сторого следовать стандарту надо сказать об этом процессору и тогда операции будут медленнее но строго соответствовать стандарту(но не вашим ожиданиям) т.к. некоторые значения конечных дробей в десятичной системе в двоичной бесконечны, и наоборот. Кстати из экшнскрипта заставить процессор строго следовать стандарту не получится.

Добавлено через 1 минуту
http://habrahabr.ru/post/123883/ вот ещё, комменты тоже полезны

Добавлено через 6 минут
Более того, от порядка вычисления зависит результат.
Код AS3:
var a:Number = (2+3)/7;
var b:Number = (2/7) + (3/7);
trace(a==b,a,b);
будет

Код:
false 0.7142857142857143 0.7142857142857142
Добавлено через 15 минут
Это непосредственно следует из того что точность чисел с плавающей точкой зависит от размера хранимого числа, т.е. на очень маленьких (сильно близких к нулю) и на очень больших (близких к положительной или отрицательной границе типа(часто, но ошибочно, называют бесконечностями, обозначаются +inf и -inf)) точность плохая. Так вот точность всегда плавает от размера хранимого значения, и в примере выше промежуточные результаты имеют разное значение, в первом случае пятёрка делится на 7, а во втором 2 и 3, и оба деления результаты меньше 1. Иногда совпадают, а иногда и нет. Обратите внимание в каком знаке отличие и нужна ли вам такая точность? Как правило нет. А вот если нужна то тогда применяют числа с фиксированной запятой. При том же объёме занимаемой памяти они могут хранить сильно меньший диапазон значений, но в то же время их точность фиксирована и предсказуема, а операции детерминированы(но от порядка вычислений тоже может зависеть результат, если на промежуточных значениях будут разные выходы за пределы точности). Например фиксированная запятая применяется в видеообработке для задания частоты кадров, т.к. если она будет плавать видно этого сразу не будет но видео будет плохо восприниматься. В частности в формате swf фреймрейт записан именно в формате с фиксированной запятой, что гарантирует ожидаемую точность без подвохов. Никак и ничто не может быть представлено с абсолютной точностью, вопрос в том какая будет ошибка и насколько она предсказуема.

Добавлено через 20 минут
Собственно формат то называется плавающая точка потому что точность плавает. Потому что когда вы считаете миллиарды +- одна тысячная обычно не важна, а если считаете около единицы, то одна тысячная как правило важнее.
__________________
:)

Создать новую тему Ответ Часовой пояс GMT +4, время: 10:02.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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