Pergunta

Em nosso aplicativo, atualmente ao vivo com o legado de uma decisão de armazenar todos os dados de engenharia em nosso banco de dados em SI.

Eu me preocupo que pode correr o risco de não ter precisão e exatidão suficiente na nossa base de dados ou em .NET tipos numéricos. Eu também estou preocupado que possamos ver os artefatos de matemática de ponto flutuante (apesar de que é provavelmente uma pergunta só para ela).

Por exemplo, os dados de origem pode ter sido uma quantidade pressão expressa (e ler de algum terceiro partido serviço) em psi (libras por polegada quadrada). Os engenheiros vão ter escolhido esta unidade de medida, porque (para a quantidade que está sendo expresso) esta tenderá a dar números facilmente digeridas, legíveis sem a necessidade de notação científica.

Quando 'padronização' o número, ou seja, quando converter essa quantidade para nossa própria persistência, podemos convertê-lo em Pa (Pascal), que irá exigir quer multiplicar ou dividir o número por algum outro número potencialmente grande.

Muitas vezes acabam armazenando números muito grandes ou muito pequenos, e pior -. Podemos fazer outros cálculos sobre estes números

No momento, flutuador uso ORACLE e System.Double.

O que as pessoas pensam disto?

Atualizar

Outras pesquisas têm desenterrado Unidades de medida apoio na próxima linguagem F # (em CTP como eu escrevo).

Parece que vai ser capaz de ter F # compreender a entrada do usuário, tais como:

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

Nós também será capaz de criar a nossa própria unidades derivadas e sistemas de unidades.

a criação de uma unidade derivada de Newtons em F #
(fonte: msdn.com )

Foi útil?

Solução

Keep algarismos significativos em mente - a precisão da medição. Se o PSI é conhecido por libras única inteiros, em seguida, após a conversão para Pa existem 15 casas decimais, ainda há apenas um algarismo significativo.

A precisão é diferente de precisão e realizar operações de ponto flutuante em unidades de engenharia precisa levar isso em conta durante as operações - não armazenar mais precisão do que a precisão da medição, não utilize mais de precisão em um cálculo de é conhecido.


Editar:

Você também pode considerar o uso NUMERIC(p,s) onde a precisão (número de dígitos) ea escala (número de dígitos à direita do decimal) pode ser especificado explicitamente.

Se isso não for uma opção, considere que persiste a precisão de uma medição particular de modo que possa ser relatado e / ou utilizados nos cálculos.

Outras dicas

Eu acho que enquanto você é capaz de armazenar exatamente tanta precisão quanto você realmente tem, você não tem nenhuma razão para se preocupar.

Usando o exemplo que você deu de converter PSI para pascal (1 PSI = 6 894,75 PA), Se eu tomar uma medida de digamos 14,7 PSI e convertê-lo em pascais eu recebo 101,352.825. Isso é demais precisão. Você precisaria para armazenar isso como 101.000 para refletir a precisão real do medição , e não o cálculo .

Tenha em mente que todos os números que você usa para fazer necessidade de conversão para ser pelo menos tão preciso como suas medidas para que você faça a precisão não perder durante a conversão. É melhor ter mais dígitos de precisão (pelo menos um mais) nos seus factores de conversão do que em suas medidas.

Eu acho que os dados de engenharia geralmente não é suficiente preciso se preocupar com a diferença. Você sabe "medida com um micrômetro, marcá-lo com giz, corte com um machado" do engenheiro expressão. Isto resume tudo. Preocupar-se com a diferença entre 8 algarismos significativos ou 12 em um cálculo em algo que é construído no mundo real a 2 tolerância figuras significativa simplesmente não faz sentido.

Para evitar perda de precisão devido à conversão de unidade, você pode armazenar todos os dados que vem de medição na unidade que foi medido. É claro que isso significa que você pode acabar com alguns valores de pressão que está sendo armazenado em Pa, outros em Psi, ou mesmo mmHg. Você tem que decidir-se se, que introduz mais problemas do que resolve.

E eu concordo com as outras respostas: Na maioria dos casos, a precisão oferecida por um flutuador Oracle é muito maior do que a precisão da própria medição

.

Bem, isso depende de como exato que você quer ser. Lembre-se que quando se fala de engenharia, não é suficiente apenas para armazenar o número 3,20, porque 3.2 não é o mesmo que 3,20 quando se trata de engenharia. 3.20 implica maior precisão do que 3,2, o que poderia ser 3,15 <= x <3,25 .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top