Проблема с округлением float, после вычитания...

Программирование на Юнити.

Re: Проблема с округлением float, после вычитания...

Сообщение Neodrop 09 июн 2010, 16:45

Проведите такой эксперимент : повычитайте свои дроби, а оставшееся число помножьте на столько, чтобы получилось x.xxxxx - то есть, 100,12345567 * 0.01
А вот уже после этого выведите в дебаг.
И если будет так, как должно быть (без всякого округления), то перестаньте морочить голову глупостями.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 09 июн 2010, 16:51

Код: Выделить всё
float test = 1234567891.1f - 1234567890.0f;
Debug.Log(test);

какой будет результат? правильно, 0
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с округлением float, после вычитания...

Сообщение Neodrop 09 июн 2010, 16:55

Хм. А вот это уже странно, чесно слово :-?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 09 июн 2010, 16:56

не странно, учитывая что под мантиссу выделено всего 23 бита.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с округлением float, после вычитания...

Сообщение Neodrop 09 июн 2010, 16:57

А не, не странно. Число выходит за пределы 32 битного float
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 09 июн 2010, 17:07

да, весь трюк в этом. я написал число не в пределах от ±1,5E−45 до ±3,4E38 )
количество битов под мантиссу ограничено. это определяет кол-во значащих цифр в 7-9 шт.
Последний раз редактировалось DbIMok 09 июн 2010, 17:38, всего редактировалось 1 раз.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с округлением float, после вычитания...

Сообщение Kann 09 июн 2010, 17:31

magic3d писал(а):2 Kann:
Мое последнее письмо для восстановления форума из-за вчерашнего отката. Другим тоже ведь надо знать... :)

Короче, вся проблема в том, что на float отдается всего 7 знаков, типа
100.1111 , 10.11111, 1.111111, 0.1111111


я вам в прошлый раз отвечал что используйте double или decimal
если вам не хватает точности в системе координат, это другая песня и решается далеко не тривиальными способом
Kann
Старожил
 
Сообщения: 553
Зарегистрирован: 05 ноя 2009, 14:06

Re: Проблема с округлением float, после вычитания...

Сообщение discouraged_one 10 июн 2010, 02:08

Господа,
Заранее прошу прощения у тех кто "в теме" - это к вам не относится
Прежде чем всё-таки обсуждать специфику работы с float --почитайте как оно устроено. Серьезно.
Итак начнем с того что я спрашивал изначально - как вы проверяли. Потому что правильно сказали - если выводить в лог - оно приводится к String а как оно приводится - одному богу известно. Попробуйте со String.Format поковыряться.

Отдельно для DbIMok: уже лучше - только 6-9 значащих цифр, поэтому всё-таки лучше расчитывать на 6 ;-)
EDIT: само собой значащих цифр после запятой
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 10 июн 2010, 11:03

7-9 всего значащих цифр в нормализованной форме, те Х.ХХХХХХ EXX (здесь 7) это и значит 6-8 после запятой. говоря о запятой без упоминания нормализации, вы смущаете неокрепшие умы.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с округлением float, после вычитания...

Сообщение discouraged_one 10 июн 2010, 12:43

to DbIMok Да, прошу прощения. Только одно замечание 1.XXXXXX EXX. И наверно следовало упомянуть что я говорил как раз о precision в 6-9 цифр. Откуда, как раз, этот стандартный эпсилон 1e-6 (не знаю почему не дописал сразу - может было бы понятней что я имел в виду)
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 10 июн 2010, 15:01

про какой эпсилон вы сейчас говорите? потому что эпсилон относительно 0 для float 1,4e-45 (Mathf.Epsilon). относительно 1 - 1,1e-16.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с округлением float, после вычитания...

Сообщение discouraged_one 10 июн 2010, 15:10

И вы туда же. Про эпсилон который используется для сравнения (людьми которые знают что делают (с) ;-)). Машинный эпсилон - в топку потому что он не про то. Машинный эпсилон - это минимальное x такое что 1.0+x != 1.0 всего то. Никакого отношения к точности он не имеет и если вам нужны устойчивые float операции - забудьте про него и про всё меньше 1e-6f (precision 6 цифр) [про float понятно]. Вообще даже это может быть слишком мало (для больших чисел) - но это уже кому интересно сам найдет
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 10 июн 2010, 15:37

помимо машинного, есть "официальные" эпсилон (Single.Epsilon, Double.Epsilon) относительно 0 при выбранной точности. при этом рекомендуется:
Чтобы при создании пользовательского алгоритма, определяющего, равны ли два числа с плавающей запятой, задать допустимую предельную разность двух чисел, которые следует считать равными, нужно использовать значение, превышающее значение константы Epsilon.(Обычно предельная разность в несколько раз превышает значение Epsilon.)

весьма расплывчатая формулировка. точно так же и ваши эмпирические 1e-6f от людей которые знают что делают. люди, которые знают что делают, знают с чем и когда это делают. см. выше пример с вычитанием больших чисел (123456789f = 123456789.1f) . эпсилон зависит от абсолютного значения числа, поэтому говорить о "правильном" эпсилон 1e-6f неправильно. оно подходит только для общеупотребительного диапазона 0-1000.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Проблема с округлением float, после вычитания...

Сообщение discouraged_one 10 июн 2010, 15:44

Вот теперь дело говорите! Конечно зависит, почти. Всегда можно сделать что-то вроде
Код: Выделить всё
abs(x-y) < epsilon * max(abs(x),abs(y),1.0)

1e-6 имеет смысл потому что это предельное значение для точности - меньше не стоит.
Официальный эпсилон - он как раз и есть машинный (его называют машинным не потому что в железе а потому что так сложилось)
И это, прошу прощения если вам показалось, что я считаю вас или кого-то идиотом ;-). Совсем нет, просто может немного сумбурно делюсь опытом, вот и всё ;-)
Unity Technologies
Аватара пользователя
discouraged_one
Unity Technologies
 
Сообщения: 197
Зарегистрирован: 19 май 2010, 15:56

Re: Проблема с округлением float, после вычитания...

Сообщение DbIMok 10 июн 2010, 16:20

в общем, чтобы было понятно большинству, точность для любого флоат числа его 1 миллионная часть (а то могут неправильно понять, например, в случае, если значение числа уже 1e-6).
"официальный" эпсилон различается для float, double и extended (машинного).
машинный вполне себе железный, с такой точностью работал 8087 сопроцессор.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Пред.След.

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10