Теория. Работа с размерностями знач. в переменных программ

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Теория. Работа с размерностями знач. в переменных программ

Сообщение Sharfik » 30.08.2016 18:28:50

Название темы так себе, суть вот в чем. Кто нибудь сталкивался с задачей реализовать переменные хранящие информацию не только о объеме, но и размерности данных?
К примеру параметры длины измеряются в мм, м, дм, км и т.д. Площадь в своей размерности и т.д. Некоторые параметры связаны между собой, некоторые нет.
Задумываюсь о том, а как научить программу оперировать переменными с учетом их размерности.
Последний раз редактировалось Sharfik 30.08.2016 19:40:55, всего редактировалось 1 раз.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 763
Зарегистрирован: 20.07.2013 01:04:30

Re: Теория. Работа с размерностями значений в переменных про

Сообщение Лекс Айрин » 30.08.2016 18:37:50

Sharfik, через коэффициенты. Фактически, тебе придется приводить размерности к какому нибудь одному размеру (например, мм, г и т.п.) и заводить таблицу преобразований (коэффициентов). В крайнем случае, использовать нормализацию (для больших/малых значений). Основной геморрой правильно заполнить данную таблицу.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Теория. Работа с размерностями значений в переменных про

Сообщение resident » 30.08.2016 18:39:20

Sharfik писал(а):К примеру параметры длины измеряются в мм, м, дм, км и т.д.

Всё хранится в СИ. (Единица длины метр.)
А ввод-вывод через функции аля МетрВКилометр(ДлинаВМетрах: real)

Добавлено спустя 43 секунды:
Re: Теория. Работа с размерностями значений в переменных програм
Лекс Айрин писал(а):через коэффициенты

Ага, с температурами сразу косяк
http://www.rvsn2.narod.ru/formul.htm

Добавлено спустя 6 минут 24 секунды:
Re: Теория. Работа с размерностями значений в переменных програм
Sharfik писал(а):а как научить программу оперировать переменными с учетом их размерности

В MathCad-е размерности из коробки. Можно и свои придумать. Очень удобно и наглядно.
Кстати для него можно и DLL-ки писать.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Теория. Работа с размерностями значений в переменных про

Сообщение Лекс Айрин » 30.08.2016 18:50:57

resident писал(а):Всё хранится в СИ.


Не забываем, что, допустим, литр это внесистемная единица измерения -- не смотря на ее распространенность и таких десятки или даже сотни! (шкалик, четверть, ведро, галлон, Акр...) одних унций 3 или 4. Да и если хранить, допустим, в метрах, то не стоит забывать, что расстояние может измеряться световыми годами... а в этом случае легко выйти за рамки переменной отведенной для хранения значения.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Теория. Работа с размерностями значений в переменных про

Сообщение скалогрыз » 30.08.2016 18:51:47

А ещё может начаться веселье, если в качестве размерности взять "процент от" :)
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Теория. Работа с размерностями значений в переменных про

Сообщение resident » 30.08.2016 18:53:16

Лекс Айрин писал(а):Не забываем, что, допустим, литр это внесистемная единица измерения

Единица объема в СИ - метр в кубе. И делайте с метром что хотите.
Код: Выделить всё
function CubicMeterToShkalic(M: real): real;
function ShkalicToCubicMeter(Sh: real): real;


Добавлено спустя 2 минуты 58 секунд:
Re: Теория. Работа с размерностями значений в переменных програм
Лекс Айрин писал(а):не стоит забывать, что расстояние может измеряться световыми годами

Автор, насколько я знаю, решает земные задачи - инженерка.
resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Теория. Работа с размерностями значений в переменных про

Сообщение Лекс Айрин » 30.08.2016 19:13:51

resident писал(а):Автор, насколько я знаю, решает земные задачи - инженерка.


Даже инженерные работы могут простираться от наноботов, до Звезды Смерти (ну или , допустим, орбитальной станции построенной вокруг всей планеты, с космическими лифтами и прочей атрибутикой). Так что мы ничего не знаем о границах применимости программы.


resident писал(а):Единица объема в СИ - метр в кубе.


ок. а если взять, допустим, промилле, которое традиционно измеряется (если использовать как меру солености, все остальные применения не так распространены) как грамм на литр (с учетом того, что 1 литр равен 1 кг)? Будешь хранить как килограммы на кубометры? или килограммы на килограммы?
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Теория. Работа с размерностями значений в переменных про

Сообщение Sharfik » 30.08.2016 19:22:24

resident писал(а):
Лекс Айрин писал(а):не стоит забывать, что расстояние может измеряться световыми годами

Автор, насколько я знаю, решает земные задачи - инженерка.

Лекс правильно сказал, вопрос еще в измерении. К примеру в зданиях размеры всегда в миллиметрах, а на территории уже в метрах.
Если только на этапе расчета и вывода пользователю делать преобразование из метра(си) в миллиметры, то при крупных значениях все хорошо. Но если пытаться так сохранить например сопротивление жилы провода на метр, то оно мизерное с большим кол-вом нулей. Может получится что не затолкать его в переменную типа Extended.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 763
Зарегистрирован: 20.07.2013 01:04:30

Re: Теория. Работа с размерностями значений в переменных про

Сообщение Лекс Айрин » 30.08.2016 19:28:50

Sharfik, я просто с подобными заморочками сталкивался. Например, стантартные преобразования у нас на работе BTU/ч <-->кВт/ч или м/мин <--> м/ч
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Теория. Работа с размерностями значений в переменных про

Сообщение Sharfik » 30.08.2016 19:39:01

Может где то ошибся, но наверно должно быть что то типа таких классов и структуры https://yadi.sk/i/pi8Pdnniuc9qC , а потом матрично сводить их взаимодействие. Без третьего параметра "коэффициент" в конечно записи БД, не представляю как мелкие значения хранить.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 763
Зарегистрирован: 20.07.2013 01:04:30

Re: Теория. Работа с размерностями знач. в переменных програ

Сообщение Лекс Айрин » 30.08.2016 19:46:47

Sharfik, коэффициенты нужны при пересчете. При хранении проще это делать с размерностью( единицей измерения) в отдельном поле.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Теория. Работа с размерностями знач. в переменных програ

Сообщение serge#LVL » 30.08.2016 22:37:42

Как говорил Лекс Айрин: через коэффициенты.
Вот пример перевода угловых координат. Если единицы inp_units и out_units переводятся, то выдается коэффициент пересчета, если нет, то (-1).
Естественно данные описываются структурой: величина, размерность.
В примере 6 единиц: радианы, футы, метры, угловые секунды, угловые градусы, угловая величина DMS.
Матрица коэффициентов factors. На примере перевода в радианы:
(1, 0, 0, 180/PI*3600, 180/PI, 0): радиан в радианы =1; в футы и метры не переводится = 0; в секунды = 180/PI*3600; градусы = 180/PI; в DMS =0 не переводится.
Код: Выделить всё
// get the conversion factor for converting between the input and output units
// I: input/output units codes: RADIAN=0, FEET=1, METER=2, SECOND=3, DEGREE=4, DMS=5
// O: -1 for incorrect, else conversion_factor
function get_unit_conversion_factor(inp_units,out_units: byte): real;
const
  //Таблица пересчета: 0 - единицы не конвертируются друг в друга
  // 0: Rad = (1, 0, 0, 180/PI*3600, 180/PI, 0)
  factors: array[0..5,0..5] of real =
  ( (1.0, 0.0, 0.0, 206264.8062470963, 57.295779513082323, 0.0),
    (0.0, 1.0, 0.3048006096012192, 0.0, 0.0, 1.000002000004),
    (0.0, 3.280833333333333, 1.0, 0.0, 0.0, 3.280839895013124),
    (0.484813681109536e-5, 0.0, 0.0, 1.0, 0.27777777777778e-3, 0.0),
    (0.01745329251994329, 0.0, 0.0, 3600, 1.0, 0.0),
    (0.0, 0.999998, 0.3048, 0.0, 0.0, 1.0) );
begin
  if (inp_units<=5) and (out_units<=5) then
  Result:=factors[inp_units,out_units]
  else Result:=-1;
  // Angle units can not be converted to length units
  if Result=0 then Result:=-1;
end;
serge#LVL
новенький
 
Сообщения: 13
Зарегистрирован: 19.08.2016 13:17:36

Re: Теория. Работа с размерностями знач. в переменных програ

Сообщение zub » 31.08.2016 02:57:18

serge#LVL
У вас в примере слишком большой массив - хватит [0..5] ([0..5,0..1] c учетом постоянной составляющей для температуры)
Ну и если уж всё захардкодено - нужно циферки заменить на перечислимые типы.

Sharfik
>>Задумываюсь о том, а как научить программу оперировать переменными с учетом их размерности.
Зачем? программа должна знать в чем число задано - т.е. в переменной записано 10 а мы с программой заранее договорились что это 10 световых лет - и так для всех линейных величин. и как это число отобразить в удобном виде для пользователя виде - например в парсеках.
Может быть имеет смысл организовать ввод от пользователя в разных еденицах, но хранить значения внутри программы надо в одной, заранее извесной размерности
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: Теория. Работа с размерностями знач. в переменных програ

Сообщение azsx » 31.08.2016 08:02:37

Может быть имеет смысл организовать ввод от пользователя в разных еденицах, но хранить значения внутри программы надо в одной, заранее извесной размерности

Об этом и речь. ТС хочет сперва рассчитать размеры между электронами отдельного атома, а затем, внезапно, подсчитать сколько времени потребуется улитке, чтобы доползти до края галактики. То есть если бы речь шла об обычных земных величинах, то вполне хватит обычных типов и стандарта СИ.
azsx
энтузиаст
 
Сообщения: 959
Зарегистрирован: 16.11.2015 06:38:32

Re: Теория. Работа с размерностями знач. в переменных програ

Сообщение Лекс Айрин » 31.08.2016 09:41:59

Можно, кстати, совместить. Нормальные размеры хранить в тех же метрах (часах,килограммах), а если величина достигнет слишком малого/большего значения перещелкнуть на более подходящую единицу измерения.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Общее

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

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

Рейтинг@Mail.ru