реклама на сайте
подробности

 
 
> Преобразование типов в Матлаб
AlexMad
сообщение Dec 26 2009, 21:42
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 262
Регистрация: 18-02-05
Из: SPb
Пользователь №: 2 743



Есть некоторый файл, в котором хранится структура параметров другого файла.

В матлабе я считываю этот файл, как массив байтов, потом пытаюсь разгрести.

Вот часть описания этой стуктуры

Код
struct VARIATIONAL_PARS_1
  {
     char TimeString[26];            // 26 байт - число и время завершения ввода данных
     WORD ChannelsMax;          // 2 байта - общее число каналов для выбранной платы
     WORD RealChannelsQuantity; // 2 байта - число введенных (активных) каналов
     QWORD  RealKadrsQuantity;    // 8 байт - число собранных кадров в формате 'unsigned __int64' (< 18.446.744.073.709.551.614)
     QWORD  RealSamplesQuantity;  // 8 байт - число собранных отсчетов в формате 'unsigned __int64' (< 18.446.744.073.709.551.614)
     long double TotalTime;       // 10 байт - время ввода в cекундах в формате 'LONG DOUBLE'
     double AdcRate;             // 8 байт - частота АЦП в кГц в формате 'DOUBLE'
     double InterkadrDelay;      // 8 байт - межкадровая задержка в млс в формате 'DOUBLE'
     double ChannelRate;         // 8 байт - частота сбора данных с одного канала в кГц в формате 'FLOAT'
     BOOL  ActiveAdcChannelArray[MAX_ADC_CHANNEL_QUANTITY];      // 4байта*32 - массив, каждый элемент
                                                // которого равен нулю или единице, единичное значение
                                                // соответствует тому, что данный вход активен


Строки и целые числа из считанного массива получить не проблема. А вот как преобразовать массив байтов в double средствами именно матлаб?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Dec 27 2009, 00:32
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(AlexMad @ Dec 27 2009, 00:42) *
long double TotalTime; // 10 байт - время ввода в cекундах в формате 'LONG DOUBLE'


Формат long double МатЛаб не поддерживает. И вообще этот тип данных попал под тотальный запрет, хотя и продолжает поддерживаться аппаратно в архитектуре x86. Однако я не об этом, а об избыточности применения такого типа данных в данном случае.
Даже если время измеряется с точность до 1 МИКРОсекунды, то это 6 десятичных знаков после запятой. В то время как обычный double (не long!) держит 16 десятичных знаков мантиссы. Это означает, что на целые секунды нам остается 16-6=10 десятичных знаков. А 10 в 10-ой степени это такое большое число секунд, которого хватит на 317 лет!
Поэтому можно смело менять в стуктуре тип long double на просто double, не опасаясь, что в ближайшие 317 лет потеряется 6-ой знак после запятой. А если автор темы доживет до тех лет, то ему останется еще 5 знаков после запятой, которых хватит на следующие 3 тысячелетия.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016