4

在我们的应用程序中,我们目前决定将所有工程数据存储在我们的 SI 数据库中。

我担心我们可能会冒在我们的数据库或 .NET 数字类型中没有足够精确度和准确性的风险。我还担心我们可能会看到浮点数学的伪像(尽管这可能是一个问题)。

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

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

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

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

人们对此有何看法?

更新

进一步的研究发现了即将推出的 F# 语言(在我写的 CTP 中)对度量单位的支持。

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

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

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

在 F# 中为牛顿创建派生单位
(来源:msdn.com

4

5 回答 5

6

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

精度与精度不同,对工程单位执行浮点运算需要在运算过程中考虑到这一点——不要存储比测量精度更高的精度,也不要在计算中使用比已知精度更高的精度。


编辑:

您还可以考虑使用NUMERIC(p,s)可以显式指定精度(位数)和小数位数(小数点右侧的位数)的位置。

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

于 2008-12-05T13:02:09.520 回答
3

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

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

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

于 2008-12-05T13:05:45.003 回答
2

我认为工程数据通常不够精确,无法担心差异。你知道工程师的表达“用千分尺测量,用粉笔标记,用斧头切割”。大概就是这样总结。担心 8 位有效数字或 12 位在现实世界中构建的东西与 2 位有效数字公差之间的差异是没有意义的。

于 2008-12-05T13:01:45.900 回答
1

为避免由于单位转换而导致精度损失,您可以将来自测量的所有数据存储在测量单位中。当然,这意味着您最终可能会以 Pa 存储压力值,而将其他压力值存储为 Psi,甚至毫米汞柱。你必须自己决定这是否会带来比它解决的问题更多的问题。

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

于 2008-12-05T13:08:48.773 回答
0

好吧,这取决于您想要的精确程度。请记住,在谈论工程时,仅存储数字 3.20 是不够的,因为在工程方面,3.2 与 3.20 不同。3.20 意味着比 3.2 更高的准确度,可能是3.15 <= x < 3.25

于 2008-12-05T12:59:24.143 回答