2008-12-05 17 views
4

В нашем приложении мы в настоящее время живем с наследием решения хранить все инженерные данные в нашей базе данных в SI.В каких единицах измерения вы будете хранить технические данные?

Я опасаюсь, что мы можем рискнуть не иметь достаточной точности и точности в нашей базе данных или в числовых типах .NET. Я также обеспокоен тем, что мы можем видеть артефакты математики с плавающей запятой (хотя это, вероятно, вопрос для всех).

Например, исходные данные, возможно, были выражены (и считаны с некоторыми услугами сторонних производителей) в Psi (фунты на квадратный дюйм). Инженеры выбрали эту единицу измерения, потому что (для выражаемого количества) это будет иметь тенденцию давать легко усваиваемые, читаемые человеком числа, не требуя научной нотации.

Когда мы «стандартизируем» число, т. Е. Когда мы преобразуем эту величину для нашей собственной стойкости, мы можем преобразовать ее в Pa (Pascals), которая потребует либо умножения, либо деления числа на какое-либо другое потенциально большое число.

Мы часто заканчиваем хранение очень больших или очень маленьких чисел, и еще хуже - мы можем делать дальнейшие вычисления на этих числах.

В настоящее время мы используем ORACLE float и System.Double.

Что люди думают об этом?

UPDATE

Дальнейшие исследования обнаружили Units of Measure support в предстоящем F # языке (в CTP, как я пишу).

Кажется, мы будем иметь возможность F # понимать ввод пользователя, такие как:

9.81<n/s^2> // an acceleration 

Мы также сможем создать наши собственные производные единицы и единицы системы.

creating a derived unit for Newtons in F# http://blogs.msdn.com/blogfiles/andrewkennedy/WindowsLiveWriter/UnitsofMeasureinFPartOneIntroducingUnits_A131/image_thumb_11.png

ответ

6

Держать Значимые цифры в виду - точность измерения. Если PSI известен только целыми фунтами, то после преобразования в Pa было 15 десятичных знаков, все еще остается только одна значимая цифра.

Прецизионность отличается от точности, и выполнение операций с плавающей запятой в технических единицах должно учитывать это во время операций - не храните больше точности, чем точность измерения, не используйте больше точности при расчете чем известно.


Edit:

Вы могли бы также рассмотреть возможность использования NUMERIC(p,s), где можно явно указанную точность (количество цифр) и масштаб (количество цифр справа от десятичной).

Если это не вариант, рассмотрите вопрос о сохранении точности для конкретного измерения, чтобы оно могло быть сообщено и/или использовано в расчетах.

0

Ну, это зависит от того, насколько точным вы хотите быть. Помните, что, говоря об инженерии, недостаточно просто сохранить номер 3.20, потому что 3.2 - это не то же самое, что 3.20, когда речь заходит об инженерии. 3.20 подразумевает более высокую точность, чем 3.2, которая может быть 3.15 < = x < 3.25.

2

Я думаю, что инженерные данные обычно недостаточно точны, чтобы беспокоиться о различии. Вы знаете выражение инженера: «Измерьте с помощью микрометра, отметьте его мелом, вырежьте топор». Это о суммировании. Беспокоясь о различии между 8 значащими цифрами или 12 в расчете на то, что построено в реальном мире, до 2-х значительных цифр толерантность просто не имеет смысла.

+0

-1: Это, безусловно, может иметь значение при использовании в повторных расчетах. Конечно, это будет зависеть от проблемной области, но небольшие ошибки имеют совокупный аффект с течением времени. – 2008-12-05 13:09:30

+0

@ Ken G, вы, очевидно, не понимаете точности. – 2008-12-05 13:11:59

+0

+1, потому что вы правы: если измерение имеет относительную погрешность в 1%, любая накопленная ошибка требует большого накопления, чтобы стать больше, чем это. – Treb 2008-12-05 13:16:58

3

Я думаю, что до тех пор, пока вы сможете хранить ровно столько же точности, сколько и на самом деле, у вас нет причин беспокоиться.

Используя пример, который вы указали на преобразование PSI в pascals (1 PSI = 6 894,75 pa), если я возьму оценку, равную 14,7 PSI, и преобразую ее в pascals, я получаю 101,352.825. Это слишком большая точность. Вам нужно будет хранить это как 101 000, чтобы отразить реальную точность измерения , а не расчет.

Помните, что любые номера, которые вы используете для преобразования, должны быть не менее точными, чем ваши измерения, чтобы вы не теряли точность во время преобразования. Лучше иметь больше цифр точности (по крайней мере еще один) в ваших коэффициентах преобразования, чем в ваших измерениях.

1

Чтобы избежать потери точности из-за преобразования единиц измерения, вы можете хранить все данные, полученные от измерения в блоке, в котором он был измерен. Конечно, это означает, что вы можете получить некоторые значения давления, хранящиеся в Па, другие в Psi или даже mmHg. Вы должны сами решить, создает ли это больше проблем, чем решает.

И я согласен с другими ответами: в большинстве случаев точность, предлагаемая платформой Oracle, намного выше, чем точность самого измерения.