2009-03-27 9 views
1

stocke les valeurs SimpleDB d'Amazon comme des chaînes, et je dois stocker des valeurs numériques afin qu'ils comparent toujours correctement, par exemple:La meilleure façon de formater des valeurs simples et doubles en tant que chaînes pour SimpleDB?

« 0001 » < « 0002 »

Je pense octets, entiers et décimaux seront assez simple, mais je suis un peu incertain sur la meilleure façon de gérer les singles et les doubles, car ils peuvent être très petits ou grands et apprécieraient toutes les suggestions de ceux qui sont plus intelligents que moi!

(J'utilise C#)

+0

Pouvons-nous avoir des informations pour ceux d'entre nous qui ne connaissent pas SimpleDB d'Amazon? –

+0

C'est probablement le meilleur point de départ: http://aws.amazon.com/simpledb/ – Darryl

Répondre

1

Si vous avez déjà un moyen de représenter des nombres signe magnitude (comme le integers que vous avez dit ne serait pas trop dur), alors vous êtes déjà là; -]

De Comparing Floating Point Numbers

Le flotteur IEEE et les formats doubles étaient conçus de sorte que les chiffres sont « lexicographique ordonné », qui - dans les mots de l'architecte William IEEE Kahan signifie « si deux flottante pointer numéros dans le même format sont commandés (par exemple x < y), puis ils sont commandés de la même manière que leurs bits sont réinterprété comme Sign-Magnitude entiers « .

static public string DoubleToSortableString(double dbl) 
{ 
    Int64 interpretAsLong = 
     BitConverter.ToInt64(BitConverter.GetBytes(dbl), 0); 
    return LongToSortableString(interpretAsLong); 
} 

static public double DoubleFromSortableString(string str) 
{ 
    Int64 interpretAsLong = 
     LongFromSortableString(str); 
    return BitConverter.ToDouble(BitConverter.GetBytes(interpretAsLong), 0); 
} 

static public string LongToSortableString(long lng) 
{ 
    if (lng < 0) 
     return "-" + (~lng).ToString("X16"); 
    else 
     return "0" + lng.ToString("X16"); 
} 

static public long LongFromSortableString(string str) 
{ 
    if (str.StartsWith("-")) 
     return ~long.Parse(str.Substring(1, 16), NumberStyles.HexNumber); 
    else 
     return long.Parse(str.Substring(1, 16), NumberStyles.HexNumber); 
} 
 
-0010000000000000 => -1.79769313486232E+308 
-3F0795FFFFFFFFFF => -100000 
-3F3C77FFFFFFFFFF => -10000 
-3F70BFFFFFFFFFFF => -1000 
-3FA6FFFFFFFFFFFF => -100 
-3FDBFFFFFFFFFFFF => -10 
-400FFFFFFFFFFFFF => -1 
00000000000000000 => 0 
03FF0000000000000 => 1 
04024000000000000 => 10 
04059000000000000 => 100 
0408F400000000000 => 1000 
040C3880000000000 => 10000 
040F86A0000000000 => 100000 
07FEFFFFFFFFFFFFF => 1.79769313486232E+308 
+0

En outre, les singles ne seront pas comparables aux doubles, et aucun ne sera comparable à ints avec ce schéma. – MarkusQ

+0

Yikes! Était-ce une exigence (types mixtes)? Je suppose qu'il pourrait simplement utiliser tout comme des doubles (comme vous avez suggéré) ... –

+0

@Daniel L - Non, le problème est signé-les entiers de magnitude ne comparent pas lexicalement pour les valeurs négatives (sauf si vous utilisez du matériel de magnitude , mais qui a cela ces jours-ci?). Il devra passer au complément 2 ou à un autre système de décalage plutôt qu'à une magnitude signée. – MarkusQ

0

Une option (si vous ne souhaitez pas qu'ils soient lisibles par l'homme) serait de stocker l'exposant premier (remplie de zéros), puis la mantisse. Quelque chose comme « (07: 4,5).? Pour ce qui est normalement écrit 4.5e7

* sourire * Êtes-vous allez avoir affaire avec des valeurs signées ou flotteurs positifs moins de 1 Si oui, vous aurez besoin de faire quelque chose comme offsets aussi, mais sur vos parenthèses (par exemple [] pour positif,() pour négatif) ainsi que la mantisse

Si vous voulez être en mesure de trier les entiers avec vos célibataires, etc Vous devriez probablement normalisez tout au type le plus grand (par exemple, votre double) plutôt que d'essayer d'être trop compliqué

Ainsi:

  • 7 -> [100,17.0]
  • 0,1 -> [099,11.0]
  • -2 -> (100,08.0)

et ainsi de suite.

+0

J'aime l'idée [],(): -] –

+0

Bonnes idées, merci! Valeurs signées, oui, mais types mixtes, non. Chaque "colonne" (attribut) dans le SimpleDB sera d'un seul type. – Darryl

Questions connexes