Scolring - Forum

Entraides et échanges autour de la technologie Scol - Informations and exchanges on the Scol technology

Vous pouvez changer la langue de l'interface une fois inscrit - You can change the language once registered

You are not logged in.

#1 9-Feb-2011 21:55:01

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Support float dans un tuple

Yop,

J'ai un souci avec un tuple composé de float ....

Pour retourner un tel tuple, mettons [F F] on a :

double d1, d2;
float f1, f2;

d1 = (1 + pow (5.0, 0.5)) / 2.0;
d2 = sqrt (2.0);

FSET(f1, (float) d1);
FSET(f2, (float) d2);

MMpush (m, f1);
MMpush (m, f2);
MMpush (m, ITOM (2));
MBdeftab (m);

ou

...
FSET(f2, (float) d2);

tuple = MMmalloc (m, 2, TYPETAB);
if (tuple == NIL)
{
    MMpush (m, NIL);
    return MERRMEM;
}
MMstore (m, tuple, 0, f1);
MMstore (m, tuple, 1, f2);
MMpush (m, PTOM (tuple));

FSET est une macro que j'utilise par ailleurs très bien :

#define FSET(val, f)  {                 \
  float g = (f);                      \
  (val) = (*(int*)&g) & 0xfffffffe;     \
}

Problème : les deux valeurs renvoyées dans le tuple sont toujours nulles.
Un tuple [S S] ou [S I] ou même [F I] etc fonctionne mais pas [F F]. Si je ne retourne qu'un float simple F, c'est ok aussi. Mais pas un tuple composé que de F.

Il existe pourtant quelques rares fonctions qui retournent déjà un tel tuple. Elles sont cependant assez spécifiques et je ne me rappelle pas leur comportement.

J'ai essayé malgré tout en C++ yikes avec une fonction inlinée (qui correspond à la macro C il me semble)

_inline int FTOM(float mot) {return ((*(int*)&(mot)) & 0xfffffffe); }

et à la place de FSET ...

f1 = FTOM ((float) d1);
f2 = FTOM ((float) d2);

le résultat est identique ([0.0000000 0.00000000]).

Une idée ?

Offline

#2 9-Feb-2011 22:36:49

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Support float dans un tuple

Je me répond ...

Il faut que f1 et f2 (dans mon exmple) soit des entiers et non des flottants :

/* float f1, f2; */ /* Non ! */
int f1, f2; /* Oui ! */

C'est plus un hack qu'autre chose, faudra regarder de plus près ...

Offline

#3 9-Feb-2011 22:54:56

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 5,081
Website

Re: Support float dans un tuple

parrait pas logique en effet
dans le SO3 il y a plusieurs tuples [F F]

utilisant la methode :

float f1 = 1.0f;
float f2 = 2.0f;

tuple = MMmalloc (m, 2, TYPETAB);
if (tuple == NIL)
{
    MMpush (m, NIL);
    return MERRMEM;
}
MMstore (m, tuple, 0, FTOM(f1));
MMstore (m, tuple, 1, FTOM(f2));
MMpush (m, PTOM (tuple));

Offline

#4 9-Feb-2011 22:58:17

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 5,081
Website

Re: Support float dans un tuple

... ha bein si c'est logique

si tu fais

float f1 = FTOM(1.0f); // pas bon

FTOM retourne un int pareil pour FSET qui modifie val (int)

float f1 = 1.0f;
int fscol = FTOM(f1); // ok

Offline

#5 9-Feb-2011 23:02:22

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,024
Website

Re: Support float dans un tuple

Dans ce cas, pk retourner un F seul ne pose pas de problème ? hmm

Offline

Board footer

Powered by FluxBB