Форум Flasher.ru

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

Akopalipsis 04.11.2013 02:36

Вычитание нецелых чисел
 
Сначала задал вопрос в общем разделе, но прошло время и я склонился к мысли, что это уже для раздела связанного с кодом.
Простой пример - сделал я калькулятор или что то, что предназначено для счёта и пользователь начинает считать -
Код AS3:

var a:Number = 0.030000000000001137;
var b:Number = 0.03;
trace(a-b);//1.1379786002407855e-15

Почему результат 1.1379786002407855e-15 в место ожидаемого 0.000000000000001137.
Как мне получить ожидаемый результат? И это я измеряю таймер, в котором даже такие значения очень важны.
И округлять int, uint нельзя и RegExp тоже нельзя цифры резать... Как быть? я только обрадовался, что закончил
с плавностью и распределением скачков ( считал, что сегодня доведу до ума ), но а теперь я вообще не знаю, как это можно сделать.
И даже если перевести счёт в милисекунды ( без деления на тысячу ), тоже самое. Только выявить сложнее, но ошибка остается.

Добавлено через 7 минут
И программа воспринимает число 1.1379786002407855e-15 не как 0.000000000000001137, а как полтора.

Dukobpa3 04.11.2013 06:15

Цитата:

И даже если перевести счёт в милисекунды ( без деления на тысячу )
Ты в секундах считаешь??? О_о
А вопрос не возникал почему все функции работы с временем в интовых миллисекундах?

По твоему вопросу - ничего с этим не поделаешь. Нужна точность больше - умножай на 10-100-1000, но лучше в итоге прийти к работе с целыми.

Anton Riot 04.11.2013 12:22

Цитата:

Сообщение от Akopalipsis (Сообщение 1151161)
И программа воспринимает число 1.1379786002407855e-15 не как 0.000000000000001137, а как полтора.

1.1379786002407855e-15 = 0.0000000000000011379786002407855
Какие проблемы?

Добавлено через 6 минут
Цитата:

Сообщение от Akopalipsis (Сообщение 1151161)
И округлять int, uint нельзя и RegExp тоже нельзя цифры резать...

Код AS3:

var a:Number = 0.030000000000001137;
var b:Number = 0.03;
var base:Number = 1000000000000000000;
var result:Number = Math.round((a-b)*base)/base)

Если вы делаете не гомеопатический калькулятор, такие порядки не должны быть важны. Если это случилось, то это означает, что логика не верна.

Akopalipsis 04.11.2013 14:05

Цитата:

А вопрос не возникал почему все функции работы с временем в интовых миллисекундах?
То же самое происходит. Если не попасть под вот такой случай, то можно и не заметить, что это ошибка, а списать всё на EF. Но я зная о этой ошибке смотрю по другим значениям и получается тоже самое, только показания другие.

caseyryan 04.11.2013 14:21

Akopalipsis, вам знакомо понятие "экспонента"?
Вот это число 1.1379786002407855e-15, совсем не полтора, как вам показалось

Akopalipsis 04.11.2013 14:43

Цитата:

Akopalipsis, вам знакомо понятие "экспонента"?
Теоретически, а подумал я так из - за скачка который видно визуально в момент появления этого числа, даже не скачок а ускорение.

KumoKairo 05.11.2013 00:47

Цитата:

Почему результат 1.1379786002407855e-15 в место ожидаемого 0.000000000000001137.
Потому что "числа с плавающей точкой" не зря так назвали
У первого числа точность намного выше, чем у второго. У второго точность всего 4 знака, а у первого 17. В данном случае в первом числе мантисса равна 11379786002407855, а во втором 0000000000000001137. Вы же не пишете целое число 2 как 0000000002, хотя в целом оба варианта правильные. Таким же образом экономится ограниченная память, которую отводят под число, опуская незначащие нули и заменяя их порядком числа в виде e-15 (то есть мантисса умноженная на десять в степени, которая указана после e, в данном случае мантисса умножить на десять в степени минус 15)

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

Akopalipsis 05.11.2013 01:00

KumoKairo Спасибо за обьяснения!
Цитата:

Обычно на форум пишут в случае, когда неделя упорных поисков и проб не дают никаких результатов
Во первых - я не знал, что это называется мантисса, во вторых я много тут написал.. И решил, что лучше Вам сказать ещё раз - Спасибо! Надеюсь, что от двух спасибо Вам станет лучше и Вы снимете с меня обвинения за всю пошаговую инструкцию... форум!)

caseyryan 05.11.2013 10:06

Цитата:

Во первых - я не знал, что это называется мантисса
Akopalipsis, может Вы не поверите, но ответы на большинство Ваших вопросов, довольно просто гуглятся. Даже если это не будет первым результатом в поиске, все равно некоторые усилия, приложенные к поиску, точно дадут результаты. Советую открыть для себя ресурс stackoverflow.com
Наверное ни сколько не преувеличу, сказав, что это самый полезный ресурс для программиста. Там находятся ответы процентов на 95 всех вопросов, четко и без лишней воды.
Ну а по поводу мантиссы http://ru.wikipedia.org/wiki/%D0%A7%...82%D0%BE%D0%B9

п.с. Так же очень советую почитать книжку SCJP Sun Certified Programmer for Java 6. Книжка хоть и по джаве, но там очень подробно рассматриваются вопросы типа "как это работает?" почитав её, многое поймете и об ас3.
На русском этой книги не встречал, но, видимо это и не нужно, так как экзамен сам в любом случае только на английском.

alexcon314 05.11.2013 11:14

Akopalipsis, давно пора пройти ликбез. Курсы там каке-нибудь, можно онлайн, или просто почитать что-то отвлеченное от AS, ООП и прочей шняги. Потратьте недельку-другую-третью на основы: представление данных, работа с памятью, алгоритмы, библиотеки, девелоп-окружение (редакторы-компилеры-линкеры-дебуггеры). Незамутненное понятие обо всем таком может дать изучение основ Си, по крайней мере взять как отправную точку можно. Ибо оттуда многи ноги растут, сами увидите. Без обид :).
Если решитесь, настоятельно рекомендую изучать это все под никсами. И настоятельно рекомендую консольный режим :).


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

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