您将工程数据存储在哪些计量单位?

时间:2008-12-05 12:53:54

标签: floating-point precision units-of-measurement

在我们的应用程序中,我们目前仍然承认将所有工程数据存储在SI数据库中的遗留问题。

我担心我们可能会冒险在数据库或.NET数字类型中没有足够的精度和准确性。我也担心我们可能会看到浮点数学的假象(虽然这可能是一个问题本身)。

例如,源数据可能是以Psi(磅/平方英寸)表示的压力量(并从某些第三方服务读入)。工程师将选择这个度量单位,因为(对于表达的数量),这将倾向于提供易于消化的,人类可读的数字而无需科学记数法。

当我们“标准化”数字时,即当我们将此数量转换为我们自己的持久性时,我们可能会将其转换为Pa(帕斯卡),这需要将数字乘以或除以其他可能较大的数字。

我们经常会存储非常大或非常小的数字,更糟糕的是 - 我们可能会对这些数字做进一步的计算。

目前我们使用ORACLE float和System.Double。

人们怎么想这个?

更新

在即将推出的F#语言(我写的CTP中)中发现了Units of Measure support的进一步研究。

似乎我们能够让F#了解用户输入,例如:

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

我们还可以创建自己的衍生单位和单位系统。

creating a derived unit for Newtons in F#
(来源:msdn.com

5 个答案:

答案 0 :(得分:6)

记住重要数字 - 测量的准确性。如果PSI只知道整磅,那么在转换为Pa之后有15位小数,仍然只有一个有效数字。

精度与精度不同,在工程单位上执行浮点运算需要在运算期间考虑到这一点 - 不要存储比测量精度更高的精度,不要在计算中使用比精度更高的精度众所周知。


编辑:

您也可以考虑使用NUMERIC(p,s),其中可以明确指定精度(位数)和比例(小数点右侧的位数)。

如果这不是一个选项,请考虑保持特定测量的准确性,以便在计算中报告和/或使用它。

答案 1 :(得分:3)

我认为,只要您能够存储的确与您实际拥有的精确度一样,您就没有理由担心。

使用您将PSI转换为帕斯卡(1 PSI = 6 894.75 pa)的示例,如果我测量14.7 PSI并将其转换为帕斯卡,我得到101,352.825。这太精确了。您需要将其存储为101,000以反映测量的实际精度,而不是计算

请注意,您用于转换的任何数字都必须至少与您的测量值一样精确,这样您才不会在转换过程中失去精确度。在转换因子中,最好使用比测量更多的精度数字(至少一个)。

答案 2 :(得分:2)

我认为工程数据通常不够精确,无法担心差异。你知道工程师的表达“用千分尺测量,用粉笔标记,用斧头切割”。这总结了一下。担心8个有效数字之间的差异,或者在计算现实世界中建立的2个重要数字容差的内容之间的差异是没有意义的。

答案 3 :(得分:1)

为了避免因单位转换而导致的精度损失,您可以将测量得出的所有数据存储在测量单位中。当然这意味着您可能最终将某些压力值存储在Pa中,其他在Psi,甚至mmHg。你必须自己决定是否会引入比解决的问题更多的问题。

我同意其他答案:在大多数情况下,Oracle float提供的精度远远高于测量本身的精度。

答案 4 :(得分:0)

嗯,这取决于你想要的确切程度。记住,在谈论工程时,仅仅存储数字3.20是不够的,因为在工程方面,3.2与3.20不同。 3.20意味着比3.2更高的准确度,其可以 3.15&lt; = x&lt; 3.25