Преобразование единиц в Python

Хорошо, вот что я сделал. Это не очень элегантно, но работает. Я создал шаг предварительной сборки, который выглядит следующим образом:

echo namespace Some.Namespace > "$(ProjectDir)\CiInfo.cs"
echo { >> "$(ProjectDir)\CiInfo.cs"
echo     ///^<summary^>Info about the continuous integration server build that produced this binary.^</summary^> >> "$(ProjectDir)\CiInfo.cs"
echo     public static class CiInfo >> "$(ProjectDir)\CiInfo.cs"
echo     { >> "$(ProjectDir)\CiInfo.cs"
echo         ///^<summary^>The current build number, such as "153"^</summary^> >> "$(ProjectDir)\CiInfo.cs"
echo         public const string BuildNumber = ("%BUILD_NUMBER%" == "" ? @"Unknown" : "%BUILD_NUMBER%"); >> "$(ProjectDir)\CiInfo.cs"
echo         ///^<summary^>String of the build number and build date/time, and other useful info.^</summary^> >> "$(ProjectDir)\CiInfo.cs"
echo         public const string BuildTag = ("%BUILD_TAG%" == "" ? @"nohudson" : "%BUILD_TAG%") + " built: %DATE%-%TIME%"; >> "$(ProjectDir)\CiInfo.cs"
echo     } >> "$(ProjectDir)\CiInfo.cs"
echo } >> "$(ProjectDir)\CiInfo.cs"

Затем я добавил «CiInfo.cs» в проект, но проигнорировал его из-за контроля версий. Таким образом, мне никогда не придется редактировать или фиксировать его, и у проекта всегда есть постоянная информация, которая является номером и временем последней сборки.

11
задан Peter Mortensen 11 December 2010 в 12:41
поделиться

3 ответа

Мне лично нравится Quantities благодаря его интеграции NumPy , однако он учитывает только относительные температуры, а не абсолютные.

4
ответ дан 3 December 2019 в 09:20
поделиться

Пример, как это могло бы работать:

>>> T(0*F) + 10*C
T(265.37222222222221*K) # or T(47767/180*K)
>>> T(0*F + 10*C)
T(283.15*K)
>>> 0*F + T(10*C)
T(283.15*K)
>>> 0*F + 10*C
10*K
>>> T(0*F) + T(10*C)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'absolute_temperature' and \
'absolute_temperature'
>>> T(0*F) - T(10*C)
T(245.37222222222223*K) # or T(44167/180*K)
>>> 0*F - 10*C
-10*K
0
ответ дан 3 December 2019 в 09:20
поделиться

В документации Unum довольно хорошо описано, почему это сложно:

Unum не может надежно обрабатывать преобразования между градусами Цельсия и Кельвина. Проблема называется «проблемой ложного происхождения»: 0 ° по Цельсию определяется как 273,15 К. Это действительно особый и досадный случай, поскольку в целом значение 0 не зависит от преобразования единиц измерения, например, 0 [m] = 0 [мили] = .... Здесь преобразование Кельвин / ° Цельсия характеризуется коэффициентом 1 и смещением 273,15 К. Смещение невозможно в текущей версии Unum.

Более того, оно, вероятно, никогда не будет интегрировано в будущую версию, потому что есть также концептуальная проблема: смещение должно применяться, если величина представляет собой абсолютную температуру, но не должно применяться, если величина представляет собой разницу температур. Например, повышение температуры на 1 ° Цельсия эквивалентно повышению на 1 К. Невозможно угадать, что думает пользователь, будь то абсолютная или относительная температура. Вопрос об абсолютных и относительных количествах не важен для других единиц, поскольку ответ не влияет на правило преобразования. Unum не может провести различие между этими двумя случаями.

Довольно легко концептуально увидеть проблемы, пытаясь представить символическое преобразование абсолютной температуры. С любой нормальной относительной единицей (x единица) * 2 == (x * 2) единица - математические единицы измерения коммутативны. С абсолютными температурами это не работает - трудно сделать что-либо более сложное, чем прямое преобразование температуры без других размеров единиц измерения. Вам, вероятно, лучше всего вести все расчеты в Кельвинах,

8
ответ дан 3 December 2019 в 09:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: