Différence entre le type SQL real et le type .NET Single [Résolu]

foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 28 juin 2013 à 10:09 - Dernière réponse : foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 28 juin 2013 à 11:34
3
Merci
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.

Merci ucfoutu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 28 juin 2013 à 10:26
0
Merci
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.
Commenter la réponse de ucfoutu
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 28 juin 2013 à 11:19
0
Merci
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.
Commenter la réponse de foliv57
foliv57 423 Messages postés vendredi 17 novembre 2006Date d'inscription 15 juillet 2014 Dernière intervention - 28 juin 2013 à 11:57
0
Merci
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.
Commenter la réponse de foliv57

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.