Conversion float to double
Résolu
chalmia2s
Messages postés
33
Statut
Membre
-
chalmia2s Messages postés 33 Statut Membre -
chalmia2s Messages postés 33 Statut Membre -
Bonjour,
J'ai un probleme de conversion float, double, voila la partie du programme concerné:
float *rd, float*rq;
double** dataIn;
double* queryIn;
dataIn= new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; ///n'affiche pas de message d'erreur, c bien
}
queryIn = new double[dimvect];
for(int j = 0; j < nbkp; j++)
queryIn = rq[j*dimvect];
///ici j'ai un message d'erreur:
error C2440: '=' : impossible de convertir de 'float' en 'double *'
J'ai essayer le cast:
for(int j = 0; j < nbkp; j++)
queryIn = (double)rq[j*dimvect];
///ici encore le message d'erreur:
error C2440: '=' : impossible de convertir de 'double' en 'double *'
J'ai essayé
for(int j = 0; j < nbkp; j++)
queryIn = (double*)rq[j*dimvect];
J'ai le message d'erreur:
error C2440: 'cast de type' : impossible de convertir de 'float' en 'double *'
J'ai regardé un peu dans les forums mais je n'ai rien trouvé....
quelqu'un de vous aurez une idee de comment resoudre ça???
Merci
PS : le probleme c'est que JE NE PEUX PAS declarer "rq" et "rd" comme double
et JE NE PEUX PAS declarer "dataIn" et "queryIn" comme float
J'ai un probleme de conversion float, double, voila la partie du programme concerné:
float *rd, float*rq;
double** dataIn;
double* queryIn;
dataIn= new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; ///n'affiche pas de message d'erreur, c bien
}
queryIn = new double[dimvect];
for(int j = 0; j < nbkp; j++)
queryIn = rq[j*dimvect];
///ici j'ai un message d'erreur:
error C2440: '=' : impossible de convertir de 'float' en 'double *'
J'ai essayer le cast:
for(int j = 0; j < nbkp; j++)
queryIn = (double)rq[j*dimvect];
///ici encore le message d'erreur:
error C2440: '=' : impossible de convertir de 'double' en 'double *'
J'ai essayé
for(int j = 0; j < nbkp; j++)
queryIn = (double*)rq[j*dimvect];
J'ai le message d'erreur:
error C2440: 'cast de type' : impossible de convertir de 'float' en 'double *'
J'ai regardé un peu dans les forums mais je n'ai rien trouvé....
quelqu'un de vous aurez une idee de comment resoudre ça???
Merci
PS : le probleme c'est que JE NE PEUX PAS declarer "rq" et "rd" comme double
et JE NE PEUX PAS declarer "dataIn" et "queryIn" comme float
A voir également:
- Conversion float to double
- Double ecran - Guide
- Whatsapp double sim - Guide
- Double driver - Télécharger - Pilotes & Matériel
- Qwerty to azerty - Guide
- Double appel - Guide
16 réponses
Pourquoi vouloir absolument utiliser les pointeurs, alors que ta librairie fournit déjà un type tableau ?
Tu devrais avoir plutôt ceci (impossible pour nous de vérifier)
Tu devrais avoir plutôt ceci (impossible pour nous de vérifier)
ANNdistArray queryIn=new ANNdist[dim];
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
for(int j=0; j<nbkp; j++)
for(int i=0; i<dimvect; i++)
dataIn[j][i]=rd[i+j*dimvect];
for(int j=np; j<nbkp; j++)
{
for(int i=0; i<dimvect; i++)
queryIn[i]=rq[i+j*dimvect];
kdTree = new ANNkd_tree(datatest,nPts,dim);
kdTree->annkSearch(queryIn,k,nnIdx,dists,eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
}PS. Quand tu écris du code utilises les ballises "< code >" et "< / code >" (sans les espaces bien sûr)
À mon avis tu as surtout un problème dans l'utilisation des pointeurs...
Si il marchait, que devrais faire ton programme ?
Si il marchait, que devrais faire ton programme ?
En regardant (très très) rapidement le manuel il semble qu'ils expliquent le système de numération de ANN au chapitre 2.2 (page 13)
Pourquoi ne pas définir directement dataIn comme étant de type ANNdist ?
Pourquoi ne pas définir directement dataIn comme étant de type ANNdist ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Tu as défini float *rd, *rq; c'est à dire que rq est un pointeur sur un nombre
Et tu utilises rq[j*dimvect]; comme si rq était un tableau de nombres !!!
Mais à mon avis c'est pas ta seule erreur...
Et tu utilises rq[j*dimvect]; comme si rq était un tableau de nombres !!!
Mais à mon avis c'est pas ta seule erreur...
t'avais raison, ce n'est pas la seul erreur...
je travail sur la livrairie ANN : http://www.cs.umd.edu/~mount/ANN/ :
comme input du programme j'ai des float rq ,rd (normalement je peux travailler avec des fichiers: fstream: j'ai essayer ça donne le bon resultat, mais moi j'aimerai des input float!!! )
J'utilise des variables intermediaires double: queryIn et dataIn (conversion float a double ça a marcher), j'ai utiliser ces varibles intermediaire, parceque la conversion float to ANNpoint, m'affiche un message d'erreur, donc j'ai pensé a passer par des doubles.
J'ai deux problemes:
le probleme 1 c'est la lectures des valeurs des variables:
ANNpointArray dataPts; (voir le programme en bas)
ANNpoint queryPt:
est fausse donc le resultat final sera faux voila ce que j'ai mis:
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; //////// rd et l'input du programme, c 1 flaot
}
dataPts = (ANNpointArray)dataIn;
le resulat d'affichage: dataPts est totalement differente du dataIn
dataIn =
139.6146 118.2234 179.7284
126.1869 173.2475 168.8846
160.9635 143.8929 136.9884
dataPts =
104.1179 120.8073 170.6636
1.1866e-296 122.6287 144.5706
185.701 186.0399 102.5083
le probleme 2:
c'est que quand j'appele:
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
afin de commencer la recherche du voisin le plus proche: il y a tout qui se plante, la fenetre se ferme!!!!
je comprends pas pourkoi!!!!!!????
voila le programme:
int k = 1;
int dim = 3;
eps = 0;
int maxPts = 500;
int nPts = 0;
ANNpointArray dataPts;
ANNpoint queryPt;
ANNidxArray nnIdx;
ANNdistArray dists;
ANNkd_tree* kdTree;
nnIdx = new ANNidx[k];
dists = new ANNdist[k];
double **dataIn;
double *queryIn;
int nbkp, nbkp_d, dimvect, dimvect_d;
int l1, l2, l1q, l2q; //input
float *rd; //input
float *rq; //input
nbkp_d = l1;
dimvect_d = l2;
dataIn = new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; // lecture de l'input 1
}
nbkp = l1q;
dimvect = l2q;
vector<int> indexdata;
vector<float> disttoneigh;
queryIn = new double[dimvect];
queryPt = annAllocPt(dimvect);
dataPts = annAllocPts(nbkp_d,dimvect_d);
dataPts = (ANNpointArray)dataIn;
kdTree = new ANNkd_tree( // construction de l'arbre de recherche
dataPts,
nPts,
dim);
int np=0;
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++)
queryIn[i] = rq[i+np*dimvect]; // lecture de l'input 2
queryPt = queryIn;
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
le programe retourne: disttoneigh, indexdata;
je travail sur la livrairie ANN : http://www.cs.umd.edu/~mount/ANN/ :
comme input du programme j'ai des float rq ,rd (normalement je peux travailler avec des fichiers: fstream: j'ai essayer ça donne le bon resultat, mais moi j'aimerai des input float!!! )
J'utilise des variables intermediaires double: queryIn et dataIn (conversion float a double ça a marcher), j'ai utiliser ces varibles intermediaire, parceque la conversion float to ANNpoint, m'affiche un message d'erreur, donc j'ai pensé a passer par des doubles.
J'ai deux problemes:
le probleme 1 c'est la lectures des valeurs des variables:
ANNpointArray dataPts; (voir le programme en bas)
ANNpoint queryPt:
est fausse donc le resultat final sera faux voila ce que j'ai mis:
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; //////// rd et l'input du programme, c 1 flaot
}
dataPts = (ANNpointArray)dataIn;
le resulat d'affichage: dataPts est totalement differente du dataIn
dataIn =
139.6146 118.2234 179.7284
126.1869 173.2475 168.8846
160.9635 143.8929 136.9884
dataPts =
104.1179 120.8073 170.6636
1.1866e-296 122.6287 144.5706
185.701 186.0399 102.5083
le probleme 2:
c'est que quand j'appele:
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
afin de commencer la recherche du voisin le plus proche: il y a tout qui se plante, la fenetre se ferme!!!!
je comprends pas pourkoi!!!!!!????
voila le programme:
int k = 1;
int dim = 3;
eps = 0;
int maxPts = 500;
int nPts = 0;
ANNpointArray dataPts;
ANNpoint queryPt;
ANNidxArray nnIdx;
ANNdistArray dists;
ANNkd_tree* kdTree;
nnIdx = new ANNidx[k];
dists = new ANNdist[k];
double **dataIn;
double *queryIn;
int nbkp, nbkp_d, dimvect, dimvect_d;
int l1, l2, l1q, l2q; //input
float *rd; //input
float *rq; //input
nbkp_d = l1;
dimvect_d = l2;
dataIn = new double*[nbkp_d];
for(int i=0; i<nbkp_d; i++)
dataIn[i] = new double[dimvect_d];
for(int j = 0; j < nbkp_d; j++) {
for(int i = 0; i < dimvect_d; i++)
dataIn[j][i] = rd[i+j*dimvect_d]; // lecture de l'input 1
}
nbkp = l1q;
dimvect = l2q;
vector<int> indexdata;
vector<float> disttoneigh;
queryIn = new double[dimvect];
queryPt = annAllocPt(dimvect);
dataPts = annAllocPts(nbkp_d,dimvect_d);
dataPts = (ANNpointArray)dataIn;
kdTree = new ANNkd_tree( // construction de l'arbre de recherche
dataPts,
nPts,
dim);
int np=0;
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++)
queryIn[i] = rq[i+np*dimvect]; // lecture de l'input 2
queryPt = queryIn;
kdTree->annkSearch(
queryPt,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
le programe retourne: disttoneigh, indexdata;
dataPts = (ANNpointArray)dataIn;
C'est un jolie cast mais, comme nous n'avons pas ANNpointArray, difficile de dire si il est justifié.
à mon avis, tu veux beaucoup trop mélangé des torchons et des serviettes (comme dirsait mon prof de math).
Comme dit KX, ça viens probablement de ta gestion des pointeurs.
C'est un jolie cast mais, comme nous n'avons pas ANNpointArray, difficile de dire si il est justifié.
à mon avis, tu veux beaucoup trop mélangé des torchons et des serviettes (comme dirsait mon prof de math).
Comme dit KX, ça viens probablement de ta gestion des pointeurs.
merci pour le compliment :-) moi aussi je trouve que ce cast est joli :-)...
bon je sais que j'ai des problemes.
faire:
dataPts = dataIn
ne marche pas aussi, tu auras une autre idee pour regler ça
bon je sais que j'ai des problemes.
faire:
dataPts = dataIn
ne marche pas aussi, tu auras une autre idee pour regler ça
Parce qu'on ne sait pas ce qu'il y a dans ANNpointArray !!!
Sauf erreur si tu fais dataPts = (ANNpointArray)dataIn; par défaut ton compilateur va (très) bêtement prendre les données binaires de dataIn et les mettre dans dataPts, mais si ils n'utilisent pas le même système de numération alors forcément ça va pas te donner le même résultat...
Sauf erreur si tu fais dataPts = (ANNpointArray)dataIn; par défaut ton compilateur va (très) bêtement prendre les données binaires de dataIn et les mettre dans dataPts, mais si ils n'utilisent pas le même système de numération alors forcément ça va pas te donner le même résultat...
effectivement voila ce que j'ai fait (si c juste et c ce que tu voulais dire :-) )
ANNdistArray queryIn;
ANNdistArray *dataIn;
queryIn = new ANNdist[dim];
dataIn =new ANNdist*[nbkp];
for(int i=0; i<nbkp; i++)
dataIn[i] = new ANNdist[dimvect];
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect]; //Input float
}
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
kdTree->annkSearch(
queryIn,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
la compilation marche MAIS dès que j'appele la fonction il y a tous qui se plante et la fenetre se ferme !!!!!!
il me semble qu'il y a une erreur dans la construction de l'arbre: kdTree = new ANNkd_tree(...
Mais je vois pas comment le regler
ANNdistArray queryIn;
ANNdistArray *dataIn;
queryIn = new ANNdist[dim];
dataIn =new ANNdist*[nbkp];
for(int i=0; i<nbkp; i++)
dataIn[i] = new ANNdist[dimvect];
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect]; //Input float
}
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
while ( np < nbkp) {
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
kdTree->annkSearch(
queryIn,
k,
nnIdx,
dists,
eps);
disttoneigh.push_back(sqrt(dists[0]));
indexdata.push_back((int)nnIdx[0]);
np++;
}
la compilation marche MAIS dès que j'appele la fonction il y a tous qui se plante et la fenetre se ferme !!!!!!
il me semble qu'il y a une erreur dans la construction de l'arbre: kdTree = new ANNkd_tree(...
Mais je vois pas comment le regler
for(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
tu dimensionne queryIn à dim et tu va jusqu'à dimvect, même si c'est juste, ce n'est pas très cohérent.
queryIn[i] = rq[i+np*dimvect];
}
tu dimensionne queryIn à dim et tu va jusqu'à dimvect, même si c'est juste, ce n'est pas très cohérent.
je travail avec les pointeurs, parceque pour lire l'input, il faut passer par la fonction predefinie:
et rd, le parametre 4 de cette fonction est un pointeur de type: lme_float64 *rd;
donc pour l'affectation:
datatest[j][i] = rd[i+j*dimvect_d]; //// (ligne B)
il faut que "dataIn" soit un pointeur.
sinon declarer dataIn comme ça:
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
il y les erreures:
//// pour la (ligne B)
1>c:\...\annkp.cpp(35) : error C2440: '=' : impossible de convertir de 'ANNdist (*)[dimvect]' en 'ANNdistArray'
/// (pour la ligne A)
1>c:\...\annkp.cpp(38) : error C2109: un indice requiert un type tableau ou pointeur
/// lors de la construction de l'arbre de recherche
1>c:\...\annkp.cpp(53) : error C2664: 'ANNkd_tree::ANNkd_tree(int,int,int)' : impossible de convertir le paramètre 1 de 'ANNdistArray' en 'int'
pour: Char Snipeur
il me semble que c juste
a chaque iterarion np: queryIn prends les valeurs d'une ligne de rq.
if(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL))
return 0;
nbkp = l1;
dimvect = l2;
dataIn =new ANNdist*[nbkp];
for(int i=0; i<nbkp; i++)
dataIn[i] = new ANNdist[dimvect];
for(int j = 0; j < nbkp; j++) {
for(int i = 0; i < dimvect; i++)
dataIn[j][i] = rd[i+j*dimvect]; //////(ligne A)
}
et rd, le parametre 4 de cette fonction est un pointeur de type: lme_float64 *rd;
donc pour l'affectation:
datatest[j][i] = rd[i+j*dimvect_d]; //// (ligne B)
il faut que "dataIn" soit un pointeur.
sinon declarer dataIn comme ça:
ANNdistArray dataIn=new ANNdist[nbkp][dimvect];
il y les erreures:
//// pour la (ligne B)
1>c:\...\annkp.cpp(35) : error C2440: '=' : impossible de convertir de 'ANNdist (*)[dimvect]' en 'ANNdistArray'
/// (pour la ligne A)
1>c:\...\annkp.cpp(38) : error C2109: un indice requiert un type tableau ou pointeur
/// lors de la construction de l'arbre de recherche
1>c:\...\annkp.cpp(53) : error C2664: 'ANNkd_tree::ANNkd_tree(int,int,int)' : impossible de convertir le paramètre 1 de 'ANNdistArray' en 'int'
pour: Char Snipeur
For(int i = 0; i < dimvect; i++){
queryIn[i] = rq[i+np*dimvect];
}
il me semble que c juste
a chaque iterarion np: queryIn prends les valeurs d'une ligne de rq.
À chaque fois que tu vas avoir une erreur de corrigée tu en auras une autre qui arrive, et le problème c'est qu'on a pas une vision d'ensemble du code, on ne peux pas te proposer une solution miracle...
Dans le dernier bout de code que tu as mis tu faisif(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL))
Tu as dit que rd était un pointeur ... Alors pourquoi utilises-tu &rd ?
Dans le dernier bout de code que tu as mis tu faisif(!LMECB_GetMatrix(1, &l1, &l2, &rd, NULL))
Tu as dit que rd était un pointeur ... Alors pourquoi utilises-tu &rd ?
La faute etait que avant la création de l'arbre il faillais specifier le nombre de points de datatest
mettre: nPts = nbkp_d; (pour dim c'etait fait)
MOI J'ai laissé nPts=0; !!!!! :-)
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
desolé de vous avoir pris du temps pour une faute de n'importe quoi :-)
mettre: nPts = nbkp_d; (pour dim c'etait fait)
MOI J'ai laissé nPts=0; !!!!! :-)
kdTree = new ANNkd_tree(
datatest,
nPts,
dim);
desolé de vous avoir pris du temps pour une faute de n'importe quoi :-)