Types de données Oracle: conseils sur le choix de rapport NOMBRE BINAIRE en DOUBLE?
Je suis de la génération d'une application scientifique qui effectue beaucoup de calculs en Java et en C, et la précision est essentielle. Il n'y a pas de calculs faits à l'intérieur de la base de données Oracle (il est simplement utilisé pour le stockage des variables entre les mathématiques des calculs).
J'ai utilisé de double précision type de données pour l'ensemble de mes Java et en C les variables, qui est en grande partie basé sur la norme IEEE 754. Ainsi, les données sont écrites dans la base de données et ensuite lecture de la base de données seront toutes les deux de double précision les types de données en C ou Java.
Ce que me recommandez-vous d'utiliser pour stocker le double-precision de données dans Oracle -- NOMBRE BINAIRE ou DOUBLE?
Par exemple, disons que j'ai une variable appelée X_Java
que j'écris dans la base de données de la variable X_DB
comme un BINAIRE DOUBLE. Si je devais lire ces données en Java à partir de la base de données et de les stocker dans la variable X_Java2
, serait X_Java
correspondre exactement à X_Java2
?
Comment les choses changent je stockées X_DB
dans la base de données comme un NUMÉRO?
Mise à JOUR 1: Notez que ma référence en matière de "précision" est de savoir comment fermer le nombre de lecture de la base DE données est le nombre qui était disponible avant d'être écrites DANS la base de données.
D'un côté, je pense que si le nombre disponibles, avant d'être écrites DANS la base de données est basé sur la norme IEEE 754, puis le type de données utilisé pour stocker cette valeur dans la base de données doit être une correspondance exacte si ce type de données est également basé sur la norme IEEE 754.
D'autre part, depuis un 64 bits (double précision) nombre seulement avec précision peuvent stocker jusqu'à 16 ans (parfois, 17) chiffres de précision, puis de stocker un NOMBRE dans la base de données avec 38 chiffres de précision de précision de la carte à partir de et pour la double précision. Un inconvénient est que le NOMBRE de type de données ne peut stocker que les grandes (ou petites) valeurs BINAIRES DOUBLE.
Donc, mon affectation.
Hmm, quand je l'ai lu, j'ai eu à la conclusion inverse (le titre lui-même les états à utiliser la DOUBLE). Par exemple, si les données proviennent en C ou en Java (par exemple, basé sur la norme IEEE 754), alors vous n'auriez jamais la valeur exacte de 0,1 à écrire dans la base de données. Au lieu de cela, il serait le plus proche de correspondance dans la représentation binaire (float ou double précision) à 0.1. Prendre (c'est la prochaine correspondance la plus proche à 0.1) comme le gold standard pour comparer les données écrites dans la base de données puis de les lire, il semble BINAIRE DOUBLE devrait être un match parfait.
OriginalL'auteur ggkmath | 2012-02-29
Vous devez vous connecter pour publier un commentaire.
Pour votre cas d'utilisation je pense BINAIRE DOUBLE peut être le meilleur match. Alors que le NOMBRE pourrait soutenir une plus grande précision, elle implique des conversions supplémentaires lors de l'insertion et l'extraction.
Si vous avez aussi besoin d'un soutien spécial IEEE754 des chiffres comme positif/négatif de l'infini ou de NaN alors ce serait certainement besoin d'BINAIRE DOUBLE au lieu d'un NOMBRE. Ce qui suit est la oracle de la documentation sur les types de données de 10,2
Notez cependant qu'il ne supporte pas la distinction entre le positif et le négatif zéro:
forums.oracle.com/forums/...
Sujet intéressant, à l'aide de binaire double semble exiger oracle spécifiques jdbc les méthodes et les classes, ce qui serait une raison contre leur utilisation. Les arguments au sujet de l'exactitude sont trompeuses, à mon humble avis, la base 10 n'est pas intrinsèquement plus exacte que les autres bases, vous ne pouvez pas par exemple pour stocker 1/3, mais vous pouvez en base 3.
Je ne vois pas comment tout autre type de données que binaire double pourrait magasin binaire à virgule flottante nombre plus exacte. Vous avez juste à vous assurer que il n'y a pas de conversions au nombre ou une chaîne sur le chemin de la db, par exemple dans le pilote jdbc. Mais je devrais sans doute ajouter que je n'ai pas utilisé binaire double les types de données pourtant, la plupart du temps, je travaille avec java BigDecimal et Oracle certain Nombre de types.
OriginalL'auteur Jörn Horstmann
De Oracle documentation:
Pour Nombre type de données:
Pour Binaire Double/Float type de données:
Basé sur les faits que vous n'êtes pas nombreux calculs dans les bases de données, et sont à la recherche de haute précision pour les récupérations - je pense que Nombre est le meilleur type de données à utiliser.
Mais ne sont pas le Java et le C des nombres en base 2?
OriginalL'auteur Perception
Pourquoi ne pas les stocker en tant que deux valeurs de la colonne? Pour chaque numéro de stocker la mantisse dans un certain NOMBRE de colonne et de l'exposant, dans BINARY_FLOAT ou BINARY_DOUBLE colonne. Qui vous donne le max. précision (pas de précision) et de l'ampleur de la gamme. Lorsque vous devez utiliser le numéro de récupérer les deux valeurs de la table et la "re-combiner dans un seul numéro à l'aide de votre JAVA/C code.
OriginalL'auteur Tom Stanton
Comme le PLS_INTEGER mentionné précédemment, le BINARY_FLOAT et BINARY_DOUBLE types dans Oracle 10g utilisation de la machine arithmétique et nécessitent moins d'espace de stockage, qui les rendent plus efficace que le type de NUMÉRO
http://www.dba-oracle.com/plsql/t_plsql_binary_float.htm
OriginalL'auteur zloctb