Pregunta

En nuestra aplicación, actualmente vivimos con el legado de una decisión de almacenar todos los datos de ingeniería en nuestra base de datos en SI.

Me preocupa que corramos el riesgo de no tener suficiente precisión y exactitud en nuestra base de datos o en los tipos numéricos .NET. También me preocupa que podamos ver artefactos de matemáticas de punto flotante (aunque eso es probablemente una pregunta en sí misma).

Por ejemplo, los datos de origen pueden haber sido una cantidad de presión expresada (y leída de algún servicio de terceros) en Psi (libras por pulgada cuadrada). Los ingenieros habrán elegido esta unidad de medida porque (por la cantidad que se expresa) tenderá a dar números fáciles de digerir, legibles por humanos sin requerir notación científica.

Cuando 'estandarizamos' el número, es decir, cuando convertimos esta cantidad para nuestra propia persistencia, podríamos convertirlo a Pa (Pascales), lo que requerirá multiplicar o dividir el número por algún otro número potencialmente grande.

A menudo terminamos almacenando números muy grandes o muy pequeños, y peor aún, podríamos hacer más cálculos sobre estos números.

Actualmente utilizamos ORACLE float y System.Double.

¿Qué piensa la gente de esto?

UPDATE

Investigaciones posteriores han descubierto Soporte de unidades de medida en el próximo lenguaje F # (en CTP mientras escribo).

Parece que podremos hacer que F # entienda la entrada del usuario como:

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

También podremos crear nuestras propias unidades derivadas y sistemas de unidades.

 creando una unidad derivada para Newtons en F #
(fuente: msdn.com sub>

¿Fue útil?

Solución

Tenga en cuenta cifras significativas : la precisión de la medición. Si el PSI es conocido solo por libras enteras, luego de la conversión a Pa hay 15 decimales, todavía hay una cifra significativa.

La precisión es diferente de la precisión, y realizar operaciones de punto flotante en unidades de ingeniería debe tener esto en cuenta durante las operaciones: no almacene más precisión que la precisión de la medición, no use más precisión en un cálculo que es conocido.


Editar:

También podría considerar usar NUMERIC(p,s) donde la precisión (número de dígitos) y la escala (número de dígitos a la derecha del decimal) pueden especificarse explícitamente.

Si esa no es una opción, considere persistir en la precisión de una medición en particular para que pueda ser reportada y / o utilizada en los cálculos.

Otros consejos

Creo que mientras pueda almacenar exactamente tanta precisión como realmente tiene, no tiene por qué preocuparse.

Usando el ejemplo que dio de convertir PSI a pascales (1 PSI = 6 894.75 pa), si tomo una medida de digamos 14.7 PSI y la convierto a pascales, obtengo 101,352.825. Eso es demasiada precisión. Tendría que almacenar eso como 101,000 para reflejar la precisión real de la medición , no el cálculo .

Tenga en cuenta que cualquier número que utilice para realizar la conversión debe ser al menos tan preciso como sus mediciones para que no pierda precisión durante la conversión. Es mejor tener más dígitos de precisión (al menos uno más) en sus factores de conversión que en sus mediciones.

Creo que los datos de ingeniería generalmente no son lo suficientemente precisos como para preocuparse por la diferencia. Usted conoce la expresión del ingeniero & "; Mida con un micrómetro, márquelo con tiza, corte con un hacha &" ;. Eso lo resume todo. Preocuparse por la diferencia entre 8 cifras significativas o 12 en un cálculo de algo construido en el mundo real con 2 cifras significativas, la tolerancia simplemente no tiene sentido.

Para evitar la pérdida de precisión debido a la conversión de unidades, puede almacenar todos los datos que provienen de la medición en la unidad en la que se midió. Por supuesto, eso significa que puede terminar con algunos valores de presión almacenados en Pa, otros en Psi, o incluso mmHg. Debe decidir usted mismo si eso presenta más problemas de los que resuelve.

Y estoy de acuerdo con las otras respuestas: en la mayoría de los casos, la precisión ofrecida por un flotador de Oracle es mucho mayor que la precisión de la medición misma.

Bueno, depende de cuán exacto quieras ser. Recuerde que cuando hablamos de ingeniería, no es suficiente almacenar el número 3.20, porque 3.2 no es lo mismo que 3.20 cuando se trata de ingeniería. 3.20 implica una precisión mayor que 3.2, que podría ser 3.15 & Lt; = x & Lt; 3.25 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top