[Fonction Mathématique] Partie entière et décimale...

Répondre
Partager Rechercher
Bonjour

Je recherche une fonction simulant la partie entière et la partie décimale d'un nombre en rappelant que la partie entière est égale à floor() (arrondi par entier inférieur) et la partie décimale est égale à x - floor(x); (logique)

Le truc c'est que Neverwinter ne propose pas de base de fonction floor, encore moins de fonction round, ou ceil... Bref: je suis ***** et je recherche un équivalent si quelqu'un l'a déjà fait...

Voilà
Ben si j'ai bien compris, tu pourrais peut-être faire du transtypage, un cast en fait non?

En admettant que ton nombre soit un float, tu force le stockage de ce nombre dans un type int, et forcément tu as la partie entière. Et tu peux accéder a la partie décimale en retirant au float l'int trouve que tu devra retranstyper.

les cast ce doit être du stylr : inttofloat, floattoint ... si je me souviens bien

Bonne chance.
il semblait avoir testé un jour que avec un float to int suivit d'un int to float on récupérais bien le float qu'on avait mis, et qu'il n'y avait pas de perte sur les partie decimal .. mais bon, c loin, me suis peut etre trompé, et j'ai plus mon test sous la main ... donc en fait je suis juste là pour émettre un doute ... et j'ai peut etre rien compris aussi
bon ca va, je sors
Reyan, ce que tu dis là est impossible ou alors Bioware a vraiment trafiqué son moteur ....

Par contre il me semble (c'était vrai au moins jusqu'à la 1.27), que la fonction FloatToInt() est en fait un Floor() et pas un Round() (ce qui peut d'ailleurs facilement être corrigé, mais bon..) Donc ce que tu veux est très simple :

Code PHP:

//Fonction partie décimale
float DecPartfloat fNum );


float DecPartfloat fNum )
{

    
int nT FloatToIntfNum );
    
    return 
fNum IntToFloatnT );


Pour tout nombre positif, ça devrait marcher
Bien sûr pour un nombre négatif ça ne sera pas le cas
Mais je pense que ça te suffira, sinon suffit d'utiliser la fonction abs() puis de rétablir le signe à la fin.
Ah bizarre
Ben le fait qu'un int prend un nombre moindre de bit et ne peut en aucun cas être décimal je me demande bien comment on pourrait récupérer l'info

ex:

float nombre = 3.15;
int i = 0;
float j = 0.0;

i = nombre; /* i = 3, perte des bits dis décimaux */

j = inttofloat(i); /* j = (float)i */
/* en gros on rajoute les bits poids forts à un manquant */

[..]

Ben si jamais vous constater que j vaut 3.15 alors là ... nwn est conçu comme jamais. Car cela défierai toute les loi de l'architecture binaire ...
Citation :
Provient du message de Jedaï
Reyan, ce que tu dis là est impossible ou alors Bioware a vraiment trafiqué son moteur ....
me doutait bien d'un truc du genre ^_^
c'est pour ca que j'avais émis des sérieuses réserve sur mes info, mais dans lea m^^eme veine, FloatToInt ne m'avait pas semble renvoyer 2 pour 2.5 .. mais bon, il était tard, il y avait du brouillard, et j'étais fatigué
et plus me souvient pas bien, pis c loin donc bon ...
rq : comme ces tests étaient fait en 1.27, c'est sand oute toi qui a raison, puisque j'ai pas fait trop gaffe au résultat, c'était pas ca qui m'interessais ^_^
Ben ça dépende de la définition de partie entière que tu prend, mais bon... C'est vrai que c'est la plus couramment acceptée...

Bon, je viens de vérifier, FloatToInt() n'est même pas un Floor(),
A priori elle fait Ceil() pour les négatifs et Floor() pour les positifs...
Je fais encore quelques tests, mais je suppose qu'en fait ce comportement va t'arranger si tu voulais que la partie décimale de -2.4 soit -0.4, sinon ...
Ca y est, c'est sûr : FloatToInt() est un Floor() pour les positifs et un Ceil() pour les négatifs

Ce comportement t'arrange-t-il ou veux tu qu'on le modifie afin de respecter la définition de la partie entière ?
pour le FloatToInt : ah cool ça va m'aider , bref. maintenant autre prob:

je voudrais savoir comment fonctionne SetTime

je veux en fait contrôler le repos: genre tu récupère 75% de tes points de vie, alors 0.75*8 = 6 heures s'écoulent.

Là, mon SetTime est du genre:

SetTime( GetTimeHour() + heure, GetTimeMinute() + minutes, 0, 0 );

Mais quand par exemple il y a 50 minutes cela passe au jour suivant (!) au lieu d'augmenter l'heure de 1 @@

Bref: quel est le moyen le plus simple de faire avancer le temps de quelques heures et quelques minutes?

(en tenant compte de la date actuelle?)

merci
Hum.. Es-tu sûr que ce soit un bug ?
Je veux dire : quel est le paramètrage de ton module point de vue rapport Minute Par Heure ??

Si tu as toujours 2min par heure, il est peut-être logique que SetTime() agisse ainsi.

Pour t'éviter ces problème, tu peux utiliser la fonction suivante :
HoursToSeconds( int nNbHeures );
Elle te permettra de corriger ton nombre de minute ainsi :
Code PHP:

int nNbMinutes 50;

int nNbMinHour FloatToIntHoursToSeconds) / 60.0 );

int nAddHours nNbMinutes nNbMinHour;

nNbMinutes %= nNbMinHour
Voilà

[Edit] Pour corriger des erreurs idiotes
Oups, en fait ce que je t'ai donné au-dessus n'as aucun intérêt, si ce n'est pour un test...
En fait je te conseille plutôt de faire tes calculs de durées en minutes avec la seule valeur nNbMinHour (dont je t'ai donné la manière pour l'obtenir au-dessus) plutôt que 60.0 minutes par heures, ça t'évitera bien des problèmes.

Si tu veux fournir les bonnes valeurs à SetTime() tout en utilisant 60.0 dans tes calculs antérieurs (ce qui est je pense une mauvaise idée), utilise plutôt ça :
Code PHP:

//nNbMinutes est le nombre de minute à convertir
int nNbMinHour FloatToIntHoursToSeconds) / 60.0 );
int nAddHours nNbMinutes 60;
nNbMinutes %= 60.0;
nNbMinutes /= nNbMinHour
Hum, he bien SetTime() regarde combien il a de minutes, puis il les convertis en heures selon le ratio actuel minutes/heures de ton module, autrement dit, là il rajoute 50h à la date actuelle...
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés