Easyelectronics.ru

Электроника для всех
Текущее время: 25 фев 2018, 05:02

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 23 ] 
Автор Сообщение
 Заголовок сообщения: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 16:13 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 07 фев 2015, 18:42
Сообщения: 63
здравствуйте столкнулся с такой проблемой. при подсчете очень маленьких чисел в цикле накапливается огромная погрешность. как с этим бороться?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 16:18 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1177
Умножить их на 100, 1 000, 10 000


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 16:24 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 07 фев 2015, 18:42
Сообщения: 63
кардинально это проблему не решает. все равно погрешность остается достаточно большой


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 16:25 
Старожил
Аватара пользователя

Зарегистрирован: 04 окт 2011, 10:19
Сообщения: 1235
По законам арифметики так не бывает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 16:38 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 3867
Что делать? Выполнять "деструктивные" команды деления не перед, а после накопления.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 16:46 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 1177
А зачем считать столь малые величины? Приняв 1 у.е. = 100000000 * реал.ед, можно считать даже в целочисленной арифметике, просто при выводе поставить запятую там, где надо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 17:20 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 07 фев 2015, 18:42
Сообщения: 63
ой! логическая ошибка)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 19:30 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 374
Если складываете много маленьких и копится погрешность в итоговой сумме (которая значительно больше каждого из слагаемых), то есть алгоритмы сложения на этот случай.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 19:38 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2361
Откуда: Санкт-Петербург
1. Подумать, не можете ли вы перейти на целые числа достаточной длины.
2. Если нет - почитать про метод Уэлфорда, метод Кэхэна и т.п. (надеюсь, двух названий вам хватит, чтобы нагуглить по цепочке алгоритм, подходящий именно вам).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 20:29 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 762
напомнило: http://www-users.math.umn.edu/~arnold/d ... triot.html

Да, при сложении во float малого числа с большим - не только погрешность может быть большая, но и вообще такое сложение может быть бессмысленным (гуглить "IEEE 754 циклические дыры"). Во float'е вообще много подводных камней.
А откуда берутся эти очень маленькие числа? Возможно, что с переходом на целые этой проблемы уже не будет, тем более что целые 64 разряда без проблем будут работать и в С на AVR (а в асме хоть 1024 разряда, складывать можно будет долго).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 24 дек 2017, 22:03 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 4859
От решения технического вопроса вам сначала нужно вернуться обратно к задаче
И переосмыслить еще раз способы решения
Исходить нужно из того, что float в микроконтроллере тоже нет, есть его эмуляция в glibc-avr
Предпочтительный формат вычислений для МК - целочисленный
Даже если МК не поддерживает целочисленные операции нужной разрядности то целое число все равно предпочтительнее
Большую часть задач если не все можно свести к операциям с целыми числами

Если сами не знаете как уйти от дробных - опишите задачу, подскажем


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 25 дек 2017, 00:53 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2361
Откуда: Санкт-Петербург
h4lf, на C тоже можно работать с целыми произвольной длины - не знаю, насколько эффективно (прямого доступа к переносу нет), но интринсики вроде __builtin_add_overflow в gcc выглядят, как довольно жирный намёк...
Надо будет при случае посмотреть, во что соптимизируется.
И заодно - сможет ли компилятор разобраться с трюками вроде
Код:
unsigned a, b, c;
...
c = a + b;
if (c<a || c<b) ...
(не было переноса <=> сумма >= обоих слагаемых, был - меньше одного из них)
В идеале, if должен скомпилиться в условный переход по carry флагу.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 31 дек 2017, 17:40 
Только пришел

Зарегистрирован: 14 май 2017, 19:45
Сообщения: 23
u37 писал(а):
Что делать? Выполнять "деструктивные" команды деления не перед, а после накопления.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 01 янв 2018, 17:13 
Старожил
Аватара пользователя

Зарегистрирован: 18 апр 2017, 03:01
Сообщения: 762
aamonster, это хорошо, но для AVR я такого в gcc не нашёл, как и __int128 (компилятор старый или я что-то делаю не так?). Но если будет нужно - можно сделать асм вставку или функцию. У меня пока не возникала необходимость в целых, больших чем 64 бит, но я пишу мало и редко.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 01 янв 2018, 22:54 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 351
Доброго времени суток !

Используйте avr-gcc там есть double. Дело в том что формат float и double это формат записи дроби. То есть целая часть и мантисса которая указывает дробь целой части (биты 1/2 1/4 1/8 1/16 и т.д.) По этому когда вы увеличиваете целую часть соответственно уменьшается дробная. Так что если вам не хватает float используйте double. По другому никак.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 01 янв 2018, 23:13 
Старожил

Зарегистрирован: 16 авг 2012, 23:27
Сообщения: 1558
Откуда: Москва
void1509 писал(а):
Используйте avr-gcc там есть double. Дело в том что формат float и double это формат записи дроби. То есть целая часть и мантисса которая указывает дробь целой части (биты 1/2 1/4 1/8 1/16 и т.д.) По этому когда вы увеличиваете целую часть соответственно уменьшается дробная.


Вы в этом описании float с fixed point смешали и запутали :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 01 янв 2018, 23:19 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2361
Откуда: Санкт-Петербург
"По другому никак" - это отрицание реальности? Просто неграмотностью объяснить не могу: выше описаны несколько способов обойти проблему (менее удобные, чем просто использовать double, но крайне полезные для общего развития).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 01 янв 2018, 23:32 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 2223
Откуда: КЧР, поселок Нижний Архыз
Если avr'ку заставляют флоаты считать, явно задачу неправильно поставили. Или реализация через одно место сделана!
В случае, когда нельзя обойтись фиксированной точкой, есть МК с аппаратными флоатами. Если требуются очень точные итерационные вычисления, где флоатов уже не хватает, то автор либо неправильный алгоритм разработал, либо непонятно почему считает, что эта задача под силу мелкоконтроллеру!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 02 янв 2018, 00:01 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 351
я ничего не напутал,
https://www.h-schmidt.net/FloatConverter/IEEE754.html
для тех кто хочет знать.

какой "реальности" если ТСу не хватает 32-бит для выражения числа, то вы можете умножать на 10, на 100, на 1000, хоть на 1000000. Битов все равно не прибавится их как было 32 так 32 и осталось. При приведении типов из float в long точность будет float потому что для перевода дробь будет посчитана, а точность дроби у вас float.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 02 янв 2018, 00:14 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2496
Откуда: Тольятти
void1509 писал(а):
целая часть и мантисса которая указывает дробь целой части (биты 1/2 1/4 1/8 1/16 и т.д.) По этому когда вы увеличиваете целую часть соответственно уменьшается дробная.

В плавающем формате нет целой части, есть только дробная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 02 янв 2018, 00:19 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 351
Почему вы не хотите читать ? Я же привел вам ссылку на формат float по стандарту IEEE-754 и gcc представляет float именно в этом формате - проверял. Вы сами подумайте - дробная от чего ?

ЗЫ: Пардон не правильно выразился - есть база и мантисса которая представляет из себя дробь от базы, на база сама может быть как целая так и дробная.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 02 янв 2018, 00:43 
Старожил

Зарегистрирован: 16 авг 2012, 23:27
Сообщения: 1558
Откуда: Москва
Кажется возникла путаница в терминах. Целая и дробная часть есть у fixed point, т.е. вот столько бит у нас на целую част а столько на дробную, например 16.16, или 7.25, при этом никакого стандарта вообще нет. А у float есть мантисса и экспонента, ну и знаки того и другого, при этом все биты мантиссы относятся к дробной части числа, целой у float и double нет, т.е. считается что мантисса всегда строго меньше 1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: что делать если точности float не хватает а double нет
СообщениеДобавлено: 02 янв 2018, 00:47 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 351
мантисса не строго меньше 1. допустим база 4, тогда первый бит мантиссы (1/2) это будет 2, второй бит мантиссы (1/4) это будет 1, итого число будет 7, при этом база 4, и старшие два бита мантиссы в 1.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ] 

Часовой пояс: UTC + 5 часов


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

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB