Страница 1 из 3

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

СообщениеДобавлено: 30.08.2016 18:28:50
Sharfik
Название темы так себе, суть вот в чем. Кто нибудь сталкивался с задачей реализовать переменные хранящие информацию не только о объеме, но и размерности данных?
К примеру параметры длины измеряются в мм, м, дм, км и т.д. Площадь в своей размерности и т.д. Некоторые параметры связаны между собой, некоторые нет.
Задумываюсь о том, а как научить программу оперировать переменными с учетом их размерности.

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

СообщениеДобавлено: 30.08.2016 18:37:50
Лекс Айрин
Sharfik, через коэффициенты. Фактически, тебе придется приводить размерности к какому нибудь одному размеру (например, мм, г и т.п.) и заводить таблицу преобразований (коэффициентов). В крайнем случае, использовать нормализацию (для больших/малых значений). Основной геморрой правильно заполнить данную таблицу.

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

СообщениеДобавлено: 30.08.2016 18:39:20
resident
Sharfik писал(а):К примеру параметры длины измеряются в мм, м, дм, км и т.д.

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

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

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

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

В MathCad-е размерности из коробки. Можно и свои придумать. Очень удобно и наглядно.
Кстати для него можно и DLL-ки писать.

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

СообщениеДобавлено: 30.08.2016 18:50:57
Лекс Айрин
resident писал(а):Всё хранится в СИ.


Не забываем, что, допустим, литр это внесистемная единица измерения -- не смотря на ее распространенность и таких десятки или даже сотни! (шкалик, четверть, ведро, галлон, Акр...) одних унций 3 или 4. Да и если хранить, допустим, в метрах, то не стоит забывать, что расстояние может измеряться световыми годами... а в этом случае легко выйти за рамки переменной отведенной для хранения значения.

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

СообщениеДобавлено: 30.08.2016 18:51:47
скалогрыз
А ещё может начаться веселье, если в качестве размерности взять "процент от" :)

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

СообщениеДобавлено: 30.08.2016 18:53:16
resident
Лекс Айрин писал(а):Не забываем, что, допустим, литр это внесистемная единица измерения

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


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

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

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

СообщениеДобавлено: 30.08.2016 19:13:51
Лекс Айрин
resident писал(а):Автор, насколько я знаю, решает земные задачи - инженерка.


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


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


ок. а если взять, допустим, промилле, которое традиционно измеряется (если использовать как меру солености, все остальные применения не так распространены) как грамм на литр (с учетом того, что 1 литр равен 1 кг)? Будешь хранить как килограммы на кубометры? или килограммы на килограммы?

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

СообщениеДобавлено: 30.08.2016 19:22:24
Sharfik
resident писал(а):
Лекс Айрин писал(а):не стоит забывать, что расстояние может измеряться световыми годами

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

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

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

СообщениеДобавлено: 30.08.2016 19:28:50
Лекс Айрин
Sharfik, я просто с подобными заморочками сталкивался. Например, стантартные преобразования у нас на работе BTU/ч <-->кВт/ч или м/мин <--> м/ч

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

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

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

СообщениеДобавлено: 30.08.2016 19:46:47
Лекс Айрин
Sharfik, коэффициенты нужны при пересчете. При хранении проще это делать с размерностью( единицей измерения) в отдельном поле.

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

СообщениеДобавлено: 30.08.2016 22:37:42
serge#LVL
Как говорил Лекс Айрин: через коэффициенты.
Вот пример перевода угловых координат. Если единицы 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;

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

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

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

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

СообщениеДобавлено: 31.08.2016 08:02:37
azsx
Может быть имеет смысл организовать ввод от пользователя в разных еденицах, но хранить значения внутри программы надо в одной, заранее извесной размерности

Об этом и речь. ТС хочет сперва рассчитать размеры между электронами отдельного атома, а затем, внезапно, подсчитать сколько времени потребуется улитке, чтобы доползти до края галактики. То есть если бы речь шла об обычных земных величинах, то вполне хватит обычных типов и стандарта СИ.

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

СообщениеДобавлено: 31.08.2016 09:41:59
Лекс Айрин
Можно, кстати, совместить. Нормальные размеры хранить в тех же метрах (часах,килограммах), а если величина достигнет слишком малого/большего значения перещелкнуть на более подходящую единицу измерения.