你会将工程数据存储在哪些度量单位中?

4
在我们的应用程序中,我们目前面临着一个决策遗留问题,即将所有工程数据存储在SI中。我担心我们可能存在数据库或.NET数字类型精度和准确性不足的风险。我还担心我们可能会看到浮点数学的伪影(虽然这可能是一个问题)。例如,源数据可能是以Psi(磅力/平方英寸)表示的压力量(从某个第三方服务读取)。工程师们选择了这个计量单位,因为(对于所表达的数量)这将倾向于给出易于消化的人类可读数字,而不需要科学记数法。当我们“标准化”数字时,即当我们将此数量转换为我们自己的持久性时,我们可能会将其转换为Pa(帕斯卡),这将需要将数字乘以或除以一些其他可能很大的数字。我们经常存储非常大或非常小的数字,更糟糕的是-我们可能会对这些数字进行进一步的计算。目前,我们使用ORACLE浮点和System.Double。人们对此有什么看法?更新
进一步的研究发现,在即将发布的F#语言中(我写这篇文章时还处于CTP阶段),支持度量单位

看起来,我们将能够让F#理解用户输入,例如:

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

我们也可以创建自己的派生单位和单位系统。 在F#中创建牛顿派生单位
(来源: msdn.com)
5个回答

6
记住“有效数字”——测量的准确性。如果PSI只能以整数磅为单位知道,那么转换为Pa后有15个小数位,仍然只有一个有效数字。
精度与准确性不同,在工程单位上执行浮点运算时需要考虑到这一点——不要存储比测量准确性更高的精度,不要在计算中使用比所知道的更高的精度。
编辑:
您还可以考虑使用NUMERIC(p, s),其中可以明确指定精度(数字数量)和比例(小数点右侧的数字数量)。
如果这不是一种选择,请考虑保留特定测量的准确性,以便可以报告和/或用于计算。

这假设测量的准确性是已知的。根据我的经验,这种情况经常并非如此。 - Treb
1
@Treb:同意 - 不同的问题领域有不同的要求和假设。有时候,这归结为做出保守的假设或将精度假设限制在最不准确的测量上。 - Ken Gentle

3

我认为只要您能够存储实际精度,就没有必要担心。

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

请记住,您用于转换的任何数字都需要至少与您的测量精度相同,这样在转换过程中就不会失去精度。最好在转换因子中具有更多位数的精度(至少多一位)比您的测量值。


如果测量结果是101.000,但有六个有效数字,该如何存储确切的101.000而不是101 x 10^3? - Treb
你必须知道存储的有效数字位数。然后,无论您存储101、101.000还是101.000000000001,您总是知道有六个有效数字。 - Bill the Lizard
我不喜欢在计算中使用四舍五入的想法,除非这种四舍五入不是被建模的真实世界行为的一部分。在显示数字时,舍入通常是适当的,但即使在那里,有效数字的概念也是一个粗略的简写。例如,如果读取温度为40.0F(可能精确到40.00F +/- 0.05F),转换为摄氏度将产生4.444C +/- 0.028C),将其舍入为4.4C将表示39.83F和40.01F之间的某些内容。请注意,40.0F将是40.050001F的正确最近舍入表示,但4.4C不会。 - supercat

2

我认为工程数据通常不够精确,无需担心差异。你知道工程师的说法:“用千分尺测量,用粉笔标记,用斧头切割。”这大概就是它的全部意思了。在实际建造中容差只有2个有效数字时,担心在计算中8个有效数字或12个有效数字之间的差异是没有意义的。


-1:当在重复计算中使用时,它肯定会产生影响。当然,这将取决于问题域,但小错误随着时间的推移会产生累积效应。 - Ken Gentle
@Ken G,显然你不理解精度。 - Paul Tomblin
+1 因为你是对的:如果测量具有1%的相对误差,则任何累积误差需要大量累积才能变得比它更大。 - Treb
也许我误解了你的回答--我读到你说“不用担心-这没有影响”。在仅有2个有效数字的计算中包含8或12个有效数字可能会导致错误的结果,这就是我对该回答持不同意见的地方。 - Ken Gentle
@Ken,你可以进行“足够”的有效数字计算(即比你实际需要的更多),然后再丢弃无关紧要的部分。因此,如果你将两个数乘起来,精度高于你需要的水平,一旦丢弃不必要的部分,它并不会使你的结果变差。 - Paul Tomblin
显示剩余3条评论

1
为避免由于单位转换而导致精度损失,您可以将所有来自测量的数据存储在其被测量的单位中。当然,这意味着您可能会得到一些压力值以Pa为单位存储,另一些以Psi或甚至mmHg为单位存储。您必须自己决定是否引入了更多问题。
我同意其他答案:在大多数情况下,Oracle浮点数提供的精度远高于测量本身的精度。

0

嗯,这取决于你想要多精确。记住,在谈论工程时,仅存储数字3.20是不够的,因为在工程上,3.2并不等同于3.20。3.20意味着比3.2更高的精度,而3.2可能是3.15 <= x < 3.25


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接