OVH Cloud OVH Cloud

Définir un type avec valeurs manquantes. Comment faire ?

22 réponses
Avatar
Marc
Bonjour,
je cherche à introduire la notion de valeur manquante pour des objets.
Je me suis dit que les patrons de classe pouvaient être la solution avec une
implémentation du genre :

template <class T >
class CTypeBase {

public :

CTypeBase() : FMissingValue(true),FValue(T()) {}
CTypeBase(const T &x) : FMissingValue(false),FValue(x) {}

bool IsMissingValue(void) const { return FMissingValue;}
void SetMissingValue(void) { FMissingValue=true;}

T GetValue(void) const { return FValue;}
void SetValue(T _value) { FMissingValue=false;FValue=_value;}

// redéfinition des opérateurs dans mon cas ...
// opération avec missing -> missing

private :

bool FMissingValue;
T FValue;

};

typedef CTypeBase<int> CTypeInt;

Ma question :
Pour des gros objets, ça peut convenir, mais pour des int/double/etc, ça
paraît très peu performant !
Surtout si je veux lire/écrire des données sur disque...
Est-ce que quelq'un connaît une solution à ce problème ?

Merci

10 réponses

1 2 3
Avatar
Marc Boyer
Marc wrote:
Bonjour,
je cherche à introduire la notion de valeur manquante pour des objets.


Pour quoi faire ? Quelles opérations permises sur ces objets ?

Je me suis dit que les patrons de classe pouvaient être la solution avec une
implémentation du genre :
[SNIP implementation]

Ma question :
Pour des gros objets, ça peut convenir, mais pour des int/double/etc, ça
paraît très peu performant !


Ben, comme tu ajoutes une fonctionalité que les processeurs
ne supportent pas directement, c'est normal.

Surtout si je veux lire/écrire des données sur disque...


Je vois pas le problème là.

Est-ce que quelqu'un connaît une solution à ce problème ?


Ben, je ne vois pas bien le problème en fait.

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...

Avatar
Marc
Bonjour,
je cherche à introduire la notion de valeur manquante pour des objets.


Pour quoi faire ? Quelles opérations permises sur ces objets ?


par exemple :
CTypeInt x,
y; // valeur manquante
CtypeInt z=x+y; // doit me donner valeur manquante or avec le type int
standart, il y a toujours une valeur !

Surtout si je veux lire/écrire des données sur disque...


Je vois pas le problème là.


et bien ensuite je fais des vecteurs de CTypeInt par exemple, que
j'enregistre dans une base de données au format propre.
En gros, pour le type int, je vais écrire un int et un bool soit 4+1 octets
au lieu de 4 sur mon système.
Avec des données statistiques, c'est un problème classique que de manipuler
des valeurs manquantes (réponse dans des enquêtes, etc.).


Avatar
Fabien LE LEZ
On Mon, 18 Oct 2004 13:47:15 +0200, "Marc" :

et bien ensuite je fais des vecteurs de CTypeInt par exemple, que
j'enregistre dans une base de données au format propre.
En gros, pour le type int, je vais écrire un int et un bool soit 4+1 octets
au lieu de 4 sur mon système.


Bien souvent, on utilise une valeur impossible pour symboliser une
valeur manquante. Par exemple, si tu ne connais pas l'âge d'une
personne, tu mets -1.
C'est dangereux (Y'a longtemps, certains avaient choisi "9/9/99" comme
date "bidon"... sans penser que le 9 septembre 1999 finirait par
arriver ;-) ), et ce n'est pas toujours applicable, mais c'est très
utilisé, et il arrive que ça marche bien.

Sinon, le conseil que je peux te donner : essaie avec ta méthode (4+1
octets), et si tu t'aperçois que ça prend vraiment trop de ressources,
il sera toujours temps de changer.
En d'autres termes : n'optimiser que si les mesures montrent que c'est
utile.


--
;-)

Avatar
Marc
Je n'ai aucune idée des informations qui seront stockées dans mes variables
donc il me faut quelque chose de vraiment robuste. J'imagine que les bases
de données en circulation sont confrontées au même problème de
représentation interne des valeurs manquantes...

Question subsidiaire :
J'ai vu que pour le type double, il y a une valeur qui représente l'infini
(cas à mon humble avis beaucoup + rare qu'une valeur manquante, du moins
dans mon univers statistique !)

std::numeric_limits<double> double_info;
double x=double_info.infinity();
et on a bien sûr infini + x=infini, soit à peu près la même chose que pour
une valeur manquante...
mais pour un int, infinity() me retourne 0 !
Est-ce que tu sais ce que représente infinity() ?

Marc
Avatar
Jean-Marc Bourguet
"Marc" writes:

Je n'ai aucune idée des informations qui seront stockées dans mes variables
donc il me faut quelque chose de vraiment robuste. J'imagine que les bases
de données en circulation sont confrontées au même problème de
représentation interne des valeurs manquantes...

Question subsidiaire :
J'ai vu que pour le type double, il y a une valeur qui représente l'infini
(cas à mon humble avis beaucoup + rare qu'une valeur manquante, du moins
dans mon univers statistique !)

std::numeric_limits<double> double_info;
double x=double_info.infinity();
et on a bien sûr infini + x=infini, soit à peu près la même chose que pour


Attention, il y a deux infinis avec les flottants courants.
Potentiellement plus adapte tu as les NaN (Not a Number) qui sont
absorbant pour toutes les operations.

Les entiers utilisent generalement toutes les representations.
Eventuellement tu peux utiliser MIN_INT et reduire donc a un
intervalle symetrique (ou -O pour les machines en complement a 1 ou
grandeur et signe s'il en traine de ton cote).

Sinon tu peux aussi envisager un bitmap separe indiquant la validite
des donnees pour le stockage. La representation interne, je la laisse
a ton choix.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
kanze
"Marc" wrote in message
news:<4173b3a2$0$8966$...

Je n'ai aucune idée des informations qui seront stockées dans mes
variables donc il me faut quelque chose de vraiment robuste. J'imagine
que les bases de données en circulation sont confrontées au même
problème de représentation interne des valeurs manquantes...


Oui. Elles utilise un octet supplémentaire.

Comme a dit Fabien, tant qu'il n'y a pas de preuve que c'est un
problème, un bool en plus est la solution universellement admis. Même is
parfois il fait doubler la taille de l'objet. (Les contraints
d'alignement veut dire qu'un bool plus un int a typiquement besoin de 8
octets à la place de 4.)

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Marc
Comme a dit Fabien, tant qu'il n'y a pas de preuve que c'est un
problème, un bool en plus est la solution universellement admis. Même is
parfois il fait doubler la taille de l'objet. (Les contraints
d'alignement veut dire qu'un bool plus un int a typiquement besoin de 8
octets à la place de 4.)


merci,
c'est justement une question que je me posais.
Vaut-il mieux stocker l'information sur une valeur manquante dans un int (4
octets) avec les valeurs 0 ou 1 que dans un bool ? C'est plus rapide en
lecture/écriture sur disque et traitement en mémoire ?

Avatar
Jean-Marc Bourguet
"Marc" writes:

Comme a dit Fabien, tant qu'il n'y a pas de preuve que c'est un
problème, un bool en plus est la solution universellement admis. Même is
parfois il fait doubler la taille de l'objet. (Les contraints
d'alignement veut dire qu'un bool plus un int a typiquement besoin de 8
octets à la place de 4.)


merci,
c'est justement une question que je me posais.
Vaut-il mieux stocker l'information sur une valeur manquante dans un int (4
octets) avec les valeurs 0 ou 1 que dans un bool ?


C'est quoi tes criteres de meilleur?

Il y a des chances pour que sizeof(bool) == sizeof(int)

Avec

struct A { int i; bool b; };
struct B { int i; int i2; };

je serais tres etonne sur une architecture moderne d'avoir
sizeof(A) != sizeof(B).

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


Avatar
Marc
Il y a des chances pour que sizeof(bool) == sizeof(int)


désolé,
mais chez moi (Windows + compilateur C++Builder 6),
sizeof(bool) donne 1
et sizeof(int) donne 4

Marc

Avatar
Jean-Marc Bourguet
"Marc" writes:

Il y a des chances pour que sizeof(bool) == sizeof(int)


désolé,
mais chez moi (Windows + compilateur C++Builder 6),
sizeof(bool) donne 1
et sizeof(int) donne 4


Bizarre, je viens d'essayer et c'est ce que me donne tous mes
compilateurs aussi (g++ sur Solaris et Linux, CC sur Solaris, aCC sur
HP-UX, xlC sur AIX). Qu'est-ce qui a bien pu me laisser penser ca?

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org


1 2 3