2008-12-05 8 views
4

Dans notre application, nous vivons actuellement avec l'héritage d'une décision de stocker toutes les données d'ingénierie dans notre base de données dans SI. Je crains que nous ne courions le risque de ne pas avoir une précision et une précision suffisantes dans notre base de données ou dans les types numériques .NET. Je suis également inquiet que nous puissions voir des artefacts de mathématiques à virgule flottante (bien que ce soit probablement une question à part entière). Par exemple, les données source peuvent avoir été une quantité de pression exprimée (et lue depuis un service tiers) en Psi (livres par pouce carré). Les ingénieurs auront choisi cette unité de mesure parce que (pour la quantité exprimée) cela tendra à donner des nombres faciles à digérer, lisibles par l'homme sans exiger de notation scientifique. Lorsque nous "standardisons" le nombre, c'est-à-dire lorsque nous convertissons cette quantité pour notre propre persistance, nous pouvons la convertir en Pa (Pascals), ce qui nécessite de la multiplier ou de la diviser par un autre nombre potentiellement important.Dans quelles unités de mesure stockez-vous les données d'ingénierie?

Nous finissons souvent par stocker des nombres très grands ou très petits, et pire - nous pourrions faire d'autres calculs sur ces nombres. À l'heure actuelle, nous utilisons ORACLE float et System.Double.

Qu'en pensent les gens?

MISE À JOUR

D'autres recherches ont mis au jour Units of Measure support dans la langue à venir F # (en CTP que j'écris).

Il semble que nous serons en mesure d'avoir F # comprendre l'entrée d'utilisateur tels que:

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

Nous allons également pouvoir créer nos propres unités dérivées et les systèmes unitaires.

creating a derived unit for Newtons in F# http://blogs.msdn.com/blogfiles/andrewkennedy/WindowsLiveWriter/UnitsofMeasureinFPartOneIntroducingUnits_A131/image_thumb_11.png

Répondre

6

Conserver des chiffres significatifs à l'esprit - la précision de la mesure. Si le PSI n'est connu que pour des livres entières, après la conversion en Pa il y a 15 décimales, il n'y a encore qu'un chiffre significatif.

La précision est différente de la précision, et les opérations en virgule flottante sur les unités d'ingénierie doivent en tenir compte pendant les opérations - ne pas stocker plus de précision que la précision de la mesure, ne pas utiliser plus de précision que ce qui est connu.


Edit:

Vous pouvez également envisager d'utiliser NUMERIC(p,s) où la précision (nombre de chiffres) et l'échelle (nombre de chiffres à la droite de la virgule) peut être explicitement spécifié.

Si ce n'est pas le cas, envisager de conserver la précision pour une mesure particulière afin qu'elle puisse être rapportée et/ou utilisée dans les calculs.

+0

Cela suppose que la précision de la mesure est connue. D'après mon expérience, ce n'est souvent pas le cas. – Treb

+1

@Treb: D'accord - différents domaines de problèmes ont des exigences et des hypothèses différentes. Parfois, il s'agit de faire des hypothèses conservatrices ou de limiter les hypothèses de précision à la mesure la moins précise. –

0

Eh bien, cela dépend de la façon dont exacte que vous voulez être. Rappelez-vous que lorsque vous parlez d'ingénierie, il ne suffit pas de stocker le nombre 3.20, parce que 3.2 n'est pas la même chose que 3.20 quand il s'agit d'ingénierie. 3,20 implique une précision supérieure à 3,2, ce qui pourrait être 3,15 < = x < 3,25.

2

Je pense que les données d'ingénierie ne sont généralement pas assez précises pour s'inquiéter de la différence. Vous connaissez l'expression de l'ingénieur "mesurer avec un micromètre, marquer avec de la craie, couper avec une hache". ça résume à peu près. S'inquiéter de la différence entre 8 chiffres significatifs ou 12 dans un calcul sur quelque chose qui est construit dans le monde réel à 2 chiffres significatifs la tolérance n'a tout simplement pas de sens.

+0

-1: Cela peut certainement faire la différence lorsqu'il est utilisé dans des calculs répétés. Cela dépendra du domaine du problème, bien sûr, mais les petites erreurs ont un effet cumulatif dans le temps. –

+0

@Ken G, vous ne comprenez évidemment pas la précision. –

+0

+1 parce que vous avez raison: Si la mesure a une erreur relative de 1%, toute erreur accumulée nécessite beaucoup d'accumulation pour devenir plus grande que cela. – Treb

3

Je pense que tant que vous êtes en mesure de stocker exactement autant de précision que vous avez réellement, vous n'avez aucune raison de s'inquiéter. En utilisant l'exemple que vous avez donné de conversion de PSI en pascals (1 PSI = 6 894.75 pa), si je prends une mesure de dire 14.7 PSI et le convertir en pascals, je reçois 101.352.825. C'est trop de précision. Vous devez stocker cela comme 101 000 pour refléter la précision réelle de la mesure , pas le de calcul. Gardez à l'esprit que tous les nombres que vous utilisez pour effectuer la conversion doivent être au moins aussi précis que vos mesures afin de ne pas perdre de précision pendant la conversion. Il est préférable d'avoir plus de chiffres de précision (au moins un de plus) dans vos facteurs de conversion que dans vos mesures.

+0

Et si la mesure est 101.000, mais avec six chiffres significatifs? Comment stockez-vous que c'est exactement 101.000, pas 101 x 10^3? – Treb

+0

Vous devez savoir combien de chiffres significatifs vous stockez. Ensuite, peu importe si vous stockez 101, 101.000 ou 101.000000000001, vous savez toujours que six chiffres sont significatifs. –

+0

Je n'aime pas l'idée d'arrondir les nombres utilisés dans les calculs lorsque ces arrondis ne font pas partie du comportement réel modélisé. Lors de l'affichage des nombres, arrondir est généralement approprié, mais même là, la notion de chiffres significatifs est un raccourci grossier. Par exemple, si l'on lit une température de 40.0F (qui pourrait être aussi précise que 40.00F +/- 0.05F), la conversion en Celcius donnerait 4.444C +/- 0.028C) Arrondir cela à 4.4C représenterait quelque chose entre 39.83 F et 40.01F. Notez que 40.0F serait une représentation arrondie correcte de 40.050001F, mais pas 4.4C. – supercat

1

Pour éviter la perte de précision due à la conversion d'unité, vous pouvez stocker toutes les données provenant de la mesure dans l'unité dans laquelle elle a été mesurée. Bien sûr, vous pouvez vous retrouver avec des valeurs de pression stockées dans Pa. d'autres dans Psi, ou même mmHg. Vous devez décider vous-même si cela introduit plus de problèmes que cela résout.

Et je suis d'accord avec les autres réponses: Dans la plupart des cas, la précision offerte par un flottant Oracle est beaucoup plus élevée que la précision de la mesure elle-même.

Questions connexes