Différence entre le type SQL real et le type .NET Single

Résolu
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 - 28 juin 2013 à 10:09
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 - 28 juin 2013 à 11:57
Bonjour à tous,

Avez-vous déjà remarqué la différence subtile entre le type de données 'sql.90).aspx real' en SQL Server et le type de données 'vs.90).aspx Single' en .Net ?

Ce sont tous les deux des nombres à virgule flottante stockés sur 4 octets, mais pourtant, leur plage de valeurs n'est pas la même.

' real ' : (de -3,40E+38 à -1,18E-38 ) et (de 1,18E-38 à 3,40E+38)
'Single' : (de -3,40E+38 à -1,40E-45) et (de 1,40E-45 à 3,40E+38)

Il est pourtant coutume d'utiliser le type Single pour envoyer des données dans un champs real d'une base SQL Server à l'aide d'une SqlCommand.

J'ai fait cette découverte en créant un générateur de données aléatoires pour remplir automatiquement les tables de mes bases SQL Server de test (je ne supportais plus toto, tata et toute sa famille).

Lorsque je génère une valeur aléatoire de type Single, je peux me retrouver avec le résultat 4,19E-40, qui est bien dans la plage du type Single mais qui provoque une erreur lors de l'ajout dans la base SQL car 4,19E-40 < 1,18E-38.

J'ai résolu le problème en contrôlant si la valeur générée est dans la plage du type real.

Ma question est donc : Quelqu'un peut-il m'expliquer la raison de cette différence ? Est-ce juste une question de norme ?

Nota : Même remarque pour la différence entre 'float' SQL Server et '=vs.90).aspx Double' .Net.

4 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 juin 2013 à 11:34
Le lien d'équivalence est bloqué par mon anti-virus

Je ne sais pas pourquoi. Le mien (ainsi que mon pare-feu) ne le bloque pas. Et il est pourtant particulièrement sévère !
Quà cela ne tienne ===>> voilà le même tableau sur le site MSDN !
Tapez le texte de l'url ici.
je serai quand même curieux de connaitre la raison de cette différence.

A demander au concepteur de SQL Server, seul susceptible de savoir ce qu'il a fait et pourquoi il l'a fait.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
28 juin 2013 à 10:26
Bonjour,
SQL Server a ses types, qui y ont été définis dans un ensemble qui n'est pas celui de VB.Net.
On ne parle alors pas de "différences subtiles" (on ne peut comparer un élément d'un ensemble avec un élément d'un autre ensemble), mais simplement d'établissement d'équivalences les plus "proches".
Tu trouveras ici un tableau des équivalences entre ces deux ensembles ===>>
Tapez le texte de l'url ici.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
28 juin 2013 à 11:19
Bonjour ucfoutu,

SQL Server a ses types, qui y ont été définis dans un ensemble qui n'est pas celui de VB.Net

Pour les types, ne devrait-on pas plutôt parler de norme ? Notamment la norme IEEE 754 pour les nombres à virgule flottante.

Je ne connais pas la norme en détail, mais je pensais qu'elle définissait ce genre de point.

Dans la doc MSDN du type Single, il est bien précisé IEEE, mais pas dans la doc du type 'real' SQL. Il faut donc en conclure que real ne respecte pas la norme, ou que la norme ne définit pas la plage autour de 0.

Le lien d'équivalence est bloqué par mon anti-virus. Mais j'imagine qu'ils ont mis sql real equiv .net Single ou SqlSingle.

D'ailleur même le type SqlSingle autorise
Dim var As New SqlTypes.SqlSingle(4.31E-40)

Alors que la valeur ne pourra pas être envoyée dans une base SQL Server.

Il est clair que ce point est une question d’équivalence, mais je serai quand même curieux de connaitre la raison de cette différence.

Si cela viens uniquement du choix de dire "aller, on ne fait pas comme les autres", alors qu'on parle dans les deux cas de techno Microsoft, je vais commencer à croire qu'ils aiment faire c.... les développeur.
0
foliv57 Messages postés 420 Date d'inscription vendredi 17 novembre 2006 Statut Membre Dernière intervention 15 juillet 2014 9
28 juin 2013 à 11:57
A demander au concepteur de SQL Server, seul susceptible de savoir ce qu'il a fait et pourquoi il l'a fait.

Oui, je crois bien. Il faut être optimiste, peut être qu'un d'entre eu passera par VBFrance .

En attendant je ferai mon contrôle de plage perso.

Merci quand même.
0
Rejoignez-nous