Миландр
https://forum.milandr.ru/

Типы данных
https://forum.milandr.ru/viewtopic.php?f=27&t=2617
Страница 1 из 1

Автор:  KIA [ 2015-июл-06 12:53 ]
Заголовок сообщения:  Типы данных

Здравствуйте. Работаю с программой CodeMaster. На днях столкнулся с такой проблемой: при вычислении выражения типа a = b*57.3 (b=3.59539e+306) в окне переменных отображается значение +NAN. Сначала переменная а имела тип double, затем, поняв что значение выходит за рамки допустимого диапазона поменял тип на long double, проблема не решилась.В справке для тип double и long double указан один и тот же диапазон, соответствующий типу double.
Подскажите пожалуйста как можно выйти из данной ситуации. И вообще может ли CodeMaster работать с такими числами?
Заранее спасибо.

Автор:  редактор [ 2015-июл-06 15:16 ]
Заголовок сообщения:  Re: Типы данных

Цитата:
Подскажите пожалуйста как можно выйти из данной ситуации.
1. Поработать с данными, чтобы они влазили в рабочий диапазон
Поскольку при таких порядка точность все равно теряется, то можно представить число как (b = 3.59539 * 10^p; p = 306;)
a = b*57.3; // помним что 10^p вынесено за скобки.
2. Написать собственную математику по обработке таких больших чисел (используя вышеприведенный способ). Например описав числа как структуру. Вроде
struct MyBigDouble{
double Mantisse; // мантисса числа
int Power; // порядок числа
};
соответственно нужны будут функции умножения (порядки складываются), деления (порядки вычитаются), сложение, вычитание(порядки приводятся к единому значению или при большой разнице порядков маленькое число отбрасывается).
Как то так наверное.

Автор:  KIA [ 2015-июл-07 09:28 ]
Заголовок сообщения:  Re: Типы данных

Спасибо. Понял в каком направлении действовать.
Позвольте ещё один вопрос. При вычислении выражения типа а =0*1*0.001 получаем результат 3.59539е+306. Что это может быть за глюк?

Автор:  редактор [ 2015-июл-07 09:50 ]
Заголовок сообщения:  Re: Типы данных

Цитата:
При вычислении выражения типа а =0*1*0.001 получаем результат 3.59539е+306. Что это может быть за глюк?
либо ошибка в библиотеке, либо неверное преобразование типов. Оба варианта маловероятны, поскольку всплыли бы очень быстро.
Возможно также что неверно интерпретируются данные. Например, если а объявлено как double, а в отладчике отображается как float (или наоборот). Можно посмотреть память и расписать данные согласно стандарту.
Попробуйте обратиться в техподдержку.

Автор:  KIA [ 2015-июл-07 09:55 ]
Заголовок сообщения:  Re: Типы данных

Спасибо за советы

Автор:  prostoRoman [ 2015-июл-07 10:32 ]
Заголовок сообщения:  Re: Типы данных

Казалось бы, ан нет http://habrahabr.ru/post/258483/

Автор:  редактор [ 2015-июл-07 11:52 ]
Заголовок сообщения:  Re: Типы данных

Цитата:
Казалось бы, ан нет http://habrahabr.ru/post/258483/
Действительно все не так просто, как кажется на первый взгляд.
Привычка работать с целыми числами дает о себе знать.
С другой стороны, редкое использование плавучки пока не выводило на какие то эксцессы.

Автор:  prostoRoman [ 2015-июл-07 12:19 ]
Заголовок сообщения:  Re: Типы данных

Да спору нет. Тут работает закон 80/20 в каком то смысле - в абсолютном большинстве задач достаточно плавучки. Но людям, у которых встречаются числа в 306й степени было бы не плохо быть в курсе, что плавучка не панацея и вполне себе имеет ограничения.

А глюк видимо всё же есть. Надо сделать тестовый проект.

Автор:  редактор [ 2015-июл-07 12:41 ]
Заголовок сообщения:  Re: Типы данных

Цитата:
Но людям, у которых встречаются числа в 306й степени было бы не плохо быть в курсе, что плавучка не панацея и вполне себе имеет ограничения.
Просто надо заранее определится с диапазоном входных данных и необходимой точностью расчетов.

Однако это никак не объясняет
Цитата:
а =0*1*0.001 = 3.59539е+306.
Я бы попробовал сперва посмотреть память согласно формату записи числа. Может в рассчетах все правильно, а отображение данных хромает.

Автор:  prostoRoman [ 2015-июл-07 12:54 ]
Заголовок сообщения:  Re: Типы данных

столкнулся с такой проблемой: при вычислении выражения типа a = b*57.3 (b=3.59539e+306) в окне переменных отображается значение +NAN.
вообще, конечно, не плохо бы было увидеть хотя бы битмап памяти, где число расположено, поскольку вика говорит, что +нан быть не может https://ru.wikipedia.org/wiki/Число_двойной_точности

На счёт 0,1*0,001 предпологаю KIA упростил...

Автор:  KIA [ 2015-июл-08 14:02 ]
Заголовок сообщения:  Re: Типы данных

prostoRoman писал(а):
На счёт 0,1*0,001 предпологаю KIA упростил...
В том то и дело что не упрощал, пробовал вычислять именно этот кусок в отдельном проекте - результат такой же. Впрочем по этому поводу уже написал разработчикам.
prostoRoman писал(а):
Может в рассчетах все правильно, а отображение данных хромает
Я думаю, что если бы расчёты были правильны, то в CAN и UART выдавалось бы число хоть как-то похожее на правду, а тут передаётся такая же ерунда.

Автор:  I.Stepanov [ 2015-июл-14 14:23 ]
Заголовок сообщения:  Re: Типы данных

Здравствуйте.

Я ответил на Ваше письмо. Продублирую мой ответ тут.
В присланном Вами проекте ошибка возникает не при умножении, а при делении -0 на константу или переменную.
Это ошибка в библиотечной функции. К этому сообщению прилагается архив с патчем для библиотеки.
Архив содержит два каталога: “Inc” и “Lib”. Содержимое этих каталогов нужно скопировать в соответствующие подкаталоги каталога "CMC-ARM".

Вложения:
LibPatch-150714.zip [1.55 МБ]
232 скачивания

Автор:  KIA [ 2015-июл-21 12:30 ]
Заголовок сообщения:  Re: Типы данных

Спасибо. Библиотеки помогли

Страница 1 из 1 Часовой пояс: UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/