D'après ce que j'ai vu sur le net, lors de l'attribution d'une variable
mémoire de type float dans une variable de type int, la partie décimale du
float est généralement tronquée et injectée dans l'entier, mais les
résultats sont faux.
Le code original, sous delphi, qui est exactement le même, donne de bons
résultats, sauf que les lignes de type = ( (RecordYuv.Y[i][j]) - (
(0.0004258) * (TableauNormalise.G[i][j]) ) + ( (1.2867842) *
(TableauNormalise.B[i][j]) ) ); sont précédées de ROUND ( (
(RecordYuv.Y[i][j]) - ( (0.0004258) * (TableauNormalise.G[i][j]) ) + (
(1.2867842) * (TableauNormalise.B[i][j]) ) );
)
Donc, je pense qu'aparemment lors du stockage du résultat du calcul de type
float dans l'int, cela ne marche pas correctement et qu'il ne tronque pas le
truc.
Nous disposons d'un petit dossier résumant le code, de collègues, où nous
avons vu la fonction CLIP ( (RecordYuv.Y[i][j]) - ( (0.0004258) *
(TableauNormalise.G[i][j]) ) + ( (1.2867842) *
(TableauNormalise.B[i][j]) ) ) mais je ne trouve cela nulle part ni en c, ni
dans le code source.
Il y a t-il une fonction qui remplace le ROUND en delphi (arrondi au nombre
supérieur si c'est > .5 ou au nombre inférieur si c'est < au .5) ou quelque
chose du genre compatible C++ toute faite?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien LE LEZ
On Fri, 2 Jan 2004 04:07:47 +0100, "Vaguener Frank" wrote:
Donc, je pense qu'aparemment lors du stockage du résultat du calcul de type float dans l'int, cela ne marche pas correctement et qu'il ne tronque pas le truc.
Essaie un truc du style "floor (n + 0.5)" ou "ceil (n-0.5)"
On Fri, 2 Jan 2004 04:07:47 +0100, "Vaguener Frank"
<fvaguener@hotmail.com> wrote:
Donc, je pense qu'aparemment lors du stockage du résultat du calcul de type
float dans l'int, cela ne marche pas correctement et qu'il ne tronque pas le
truc.
Essaie un truc du style "floor (n + 0.5)" ou "ceil (n-0.5)"
On Fri, 2 Jan 2004 04:07:47 +0100, "Vaguener Frank" wrote:
Donc, je pense qu'aparemment lors du stockage du résultat du calcul de type float dans l'int, cela ne marche pas correctement et qu'il ne tronque pas le truc.
Essaie un truc du style "floor (n + 0.5)" ou "ceil (n-0.5)"
Je vais au plus vite puisque vous êtres pressé : Je suppose que vos valeurs sont positives (ça ressemble à de la colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en unsigned int. (CLIP est peut-être une macro) En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des fonctions ceil() et floor() de math.h. Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76 donnent 1, -1.23 et -1.76 donnent -1). Le plus simple pour vous est certainement d'ajouter 0.5 au résultat : TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) * (TableauNormalise.G[i][j]) ) + ( (0.0018702) * (TableauNormalise.B[i][j]) ) ); D'après moi, c'est bon comme ça. Si vous avez des valeurs négatives, vous prenez floor(tout_ça). Cordialement, Pierre
"Vaguener Frank" <fvaguener@hotmail.com> a écrit ..
Voila, j'ai un problème
J'ai des structures de tableau int de type
[...]
chose du genre compatible C++ toute faite?
Merci d'avance
Bonjour,
Je vais au plus vite puisque vous êtres pressé :
Je suppose que vos valeurs sont positives (ça ressemble à de la
colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en unsigned
int.
(CLIP est peut-être une macro)
En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des
fonctions ceil() et floor() de math.h.
Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76
donnent 1, -1.23 et -1.76 donnent -1).
Le plus simple pour vous est certainement d'ajouter 0.5 au résultat :
TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) *
(TableauNormalise.G[i][j]) ) + ( (0.0018702) *
(TableauNormalise.B[i][j]) ) );
D'après moi, c'est bon comme ça.
Si vous avez des valeurs négatives, vous prenez floor(tout_ça).
Cordialement,
Pierre
Je vais au plus vite puisque vous êtres pressé : Je suppose que vos valeurs sont positives (ça ressemble à de la colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en unsigned int. (CLIP est peut-être une macro) En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des fonctions ceil() et floor() de math.h. Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76 donnent 1, -1.23 et -1.76 donnent -1). Le plus simple pour vous est certainement d'ajouter 0.5 au résultat : TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) * (TableauNormalise.G[i][j]) ) + ( (0.0018702) * (TableauNormalise.B[i][j]) ) ); D'après moi, c'est bon comme ça. Si vous avez des valeurs négatives, vous prenez floor(tout_ça). Cordialement, Pierre
Vaguener Frank
Exactement, il s'agit d'un espace colométrique... Un grand merci à tous pour votre support !
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> a écrit dans le message de news:3ff504d1$0$29081$
"Vaguener Frank" a écrit ..
Voila, j'ai un problème
J'ai des structures de tableau int de type [...]
chose du genre compatible C++ toute faite?
Merci d'avance Bonjour,
Je vais au plus vite puisque vous êtres pressé : Je suppose que vos valeurs sont positives (ça ressemble à de la colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en unsigned
int. (CLIP est peut-être une macro) En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des fonctions ceil() et floor() de math.h. Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76 donnent 1, -1.23 et -1.76 donnent -1). Le plus simple pour vous est certainement d'ajouter 0.5 au résultat : TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) * (TableauNormalise.G[i][j]) ) + ( (0.0018702) * (TableauNormalise.B[i][j]) ) ); D'après moi, c'est bon comme ça. Si vous avez des valeurs négatives, vous prenez floor(tout_ça). Cordialement, Pierre
Exactement, il s'agit d'un espace colométrique...
Un grand merci à tous pour votre support !
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> a écrit
dans le message de news:3ff504d1$0$29081$636a55ce@news.free.fr...
"Vaguener Frank" <fvaguener@hotmail.com> a écrit ..
Voila, j'ai un problème
J'ai des structures de tableau int de type
[...]
chose du genre compatible C++ toute faite?
Merci d'avance
Bonjour,
Je vais au plus vite puisque vous êtres pressé :
Je suppose que vos valeurs sont positives (ça ressemble à de la
colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en
unsigned
int.
(CLIP est peut-être une macro)
En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des
fonctions ceil() et floor() de math.h.
Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76
donnent 1, -1.23 et -1.76 donnent -1).
Le plus simple pour vous est certainement d'ajouter 0.5 au résultat :
TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) *
(TableauNormalise.G[i][j]) ) + ( (0.0018702) *
(TableauNormalise.B[i][j]) ) );
D'après moi, c'est bon comme ça.
Si vous avez des valeurs négatives, vous prenez floor(tout_ça).
Cordialement,
Pierre
Exactement, il s'agit d'un espace colométrique... Un grand merci à tous pour votre support !
"Pierre Maurette" <mmaauurreettttttee.ppiieerrrree@@ffrreeee.ffrr> a écrit dans le message de news:3ff504d1$0$29081$
"Vaguener Frank" a écrit ..
Voila, j'ai un problème
J'ai des structures de tableau int de type [...]
chose du genre compatible C++ toute faite?
Merci d'avance Bonjour,
Je vais au plus vite puisque vous êtres pressé : Je suppose que vos valeurs sont positives (ça ressemble à de la colorimétrie). Dans ce cas, pensez peut-être à déclarer vos int en unsigned
int. (CLIP est peut-être une macro) En C++, sauf erreur de ma part, vous ne disposez à coup sûr que des fonctions ceil() et floor() de math.h. Le C++ convertit les flottants en entiers par troncation (1.23 et 1.76 donnent 1, -1.23 et -1.76 donnent -1). Le plus simple pour vous est certainement d'ajouter 0.5 au résultat : TableauRgb.V[i][j] = ((0.5) + (RecordYuv.Y[i][j]) + ( (1.524764) * (TableauNormalise.G[i][j]) ) + ( (0.0018702) * (TableauNormalise.B[i][j]) ) ); D'après moi, c'est bon comme ça. Si vous avez des valeurs négatives, vous prenez floor(tout_ça). Cordialement, Pierre