Page 2 sur 3

Publié : mer. 27/mai/2009 19:29
par Le Soldat Inconnu
pourquoi j'ai pas fait en ASM ?

Je n'y connais rien en ASM, voila pourquoi :)

En plus, ton code ASM ne fonctionne pas correctement
5.958741545 donne 6 au lieu de 5



En tout cas, j'ai mis un beau bordel sur le fofo anglais, pas mal de monde propose des solutions plus rapide que Int

J'ai tout testé, je reste le plus rapide avec ma bête fonction sans asm.

Publié : mer. 27/mai/2009 19:33
par KrisJNT
ben tu fais -1 après ! :D
Mais j'avoue que ça m'épate de voir ça. Pourquoi ne pas proposer ce code aux créateurs de PB ?

Publié : mer. 27/mai/2009 22:31
par erix14
En plus, ton code ASM ne fonctionne pas correctement
5.958741545 donne 6 au lieu de 5
J'aurais plutôt dit que c’était ton code :lol: Pour moi, c'est plus logique que 5.958741545 donne 6, mais si tu souhaites seulement la partie entière du nombre réel, pas de problème :

Code : Tout sélectionner

Tronc.w = $0FFF
FLDCW Tronc
Macro FloatToInt(float,long)
	FLD float
	FISTP long
EndMacro

Float1.f = 5.958741545
Float2.f = 5
#Nb = 50000000
Time1 = ElapsedMilliseconds()

For i = 1 To #Nb
	Long11.l = Int(Float1)
	Long12.l = Int(Float2)
Next

Time2 = ElapsedMilliseconds()

For i = 1 To #Nb
	Long21.l
	FloatToInt(Float1,Long21)
	Long22.l
	FloatToInt(Float2,Long22)
Next

Time3 = ElapsedMilliseconds()

Texte.s = "Int :" + Chr(10) + "Time = " + Str(Time2 - Time1) + " ms" + Chr(10) + StrF(Float1) + " -> " + StrF(Long11) + Chr(10) + StrF(Float2) + " -> " + StrF(Long12) + Chr(10) + Chr(10) + "IntASM :" + Chr(10) + "Time = " + Str(Time3 - Time2) + " ms" + Chr(10) + StrF(Float1) + " -> " + StrF(Long21) + Chr(10) + StrF(Float2) + " -> " + StrF(Long22) + Chr(10) + StrF((Time2 - Time1) / (Time3 - Time2), 1) + " time more fast"
SetClipboardText(Texte)
MessageRequester("Test", Texte)

Publié : mer. 27/mai/2009 22:44
par erix14
Dobro a écrit :
erix14 a écrit :@lionel_om : Bien sûr, c'est une évidence... dans cet exemple, une macro est plus qu'indiqué, car le code est très petit et le CPU passe plus de temps sur l'appel de la procédure que sur le contenu de la procédure. :wink:
oui mais dans la mesure ou pour le purebasic, il s'agit bien d'une fonction 'int()'
je crois que de le faire en fonction est plus judicieux !!

le but final serai de remplacer celle existante :)
Ne crois pas que toutes les fonctions de PureBasic soit toutes de "vraies" fonctions, certaines sont directement remplacées par du code ASM, comme par exemple certaines fonctions de math...

Publié : mer. 27/mai/2009 23:09
par Backup
erix14 a écrit :Ne crois pas que toutes les fonctions de PureBasic soit toutes de "vraies" fonctions, certaines sont directement remplacées par du code ASM, comme par exemple certaines fonctions de math...
ha bon !? effectivement dans ce cas :lol:

Publié : jeu. 28/mai/2009 8:43
par Fig
J'aurais plutôt dit que c’était ton code :lol: Pour moi, c'est plus logique que 5.958741545 donne 6
Bein non... Il n'est pas question de logique, juste de l'instruction int() qui n'effectue pas un arrondi mais en fait tronque la partie décimale ou on peut aussi dire qu'elle fait un arrondi à l'unité inférieur... (sinon il faut utiliser Round()...)

Publié : jeu. 28/mai/2009 10:16
par jerexgrz
concernant le 1er exemple: j'obtiens ca:

Int:
time=7250 ms

float:
time=5375 ms

1.3 time more fast.

RQ: J'ai un amd 5200+.

Publié : jeu. 28/mai/2009 12:03
par erix14
@Fig : Et bien si, c'est une question de logique, car si on transforme un nombre réel en un entier il est plus logique que ce nombre se rapproche le plus du nombre réel... Imagine que tu fasses un logiciel de dessin et qu’après des calculs tu doives afficher des points dont les coordonnées sont en nombre réel, et bien les contours de ton dessin seront plus jolis avec un arrondi qu'en tronquant les nombres. Maintenant, un autre exemple, je parcoure 5.9 km, est-ce que je vais dire : J'ai parcouru environ 5 km... ou j'ai parcouru environ 6 km ?

Oui, la fonction int() fait un arrondi à l'unité inférieur alors pourquoi ne pas l'appeler tout simplement floor()... :roll:

Publié : jeu. 28/mai/2009 12:18
par Backup
erix14 a écrit : Oui, la fonction int() fait un arrondi à l'unité inférieur alors pourquoi ne pas l'appeler tout simplement floor()... :roll:

hooo! stop la !! :)

la fonction int() a toujours fait partie du langage Basic (1964) !!
deja le ZX81 l'implémentait , le TI99/4A aussi !, et quasi tout les autre micro ordinateur a base de Basic :)



et effectivement il s'agit de tronquer la partie entière SANS ARRONDIR !!
"int" viens de "integer" => "partie entiere"
pour arrondir il existe depuis toujours une autre fonction Round()

purebasic se veux un Basic, au moins respectons ça ! ;)

Publié : jeu. 28/mai/2009 13:04
par Fig
erix14 a écrit : Oui, la fonction int() fait un arrondi à l'unité inférieur alors pourquoi ne pas l'appeler tout simplement floor()... :roll:
Moi je propose 'iwalkedmorekm()' :P

Oui, j'avais bien compris que c'était logique dans notre monde analogique de marcheurs prétentieux :wink:

Publié : jeu. 28/mai/2009 17:19
par Le Soldat Inconnu
pas mal, Erix14 :)

Et Int() , c'est juste la partie entière d'un flottant, pas un arrondi.
En pascal, c'est pareil, en VB, etc...

Publié : ven. 29/mai/2009 14:53
par tonton
8)
a=Int(5.9999999999999999)
Debug a

Publié : ven. 29/mai/2009 14:57
par Backup
tonton a écrit :8)
a=Int(5.9999999999999999)
Debug a
:lol: en plus ça bug !! :lol:

ça sort 6 au lieu de 5 !!! :?

Publié : ven. 29/mai/2009 17:58
par Backup
purée !!

normal , A est un entier !!
donc 5.9999 , c'est un arrondi en fait !! :)

bon je retourne dans les doc sur Tahiti moi :)

Publié : ven. 29/mai/2009 19:17
par djes
Dobro a écrit :purée !!

normal , A est un entier !!
donc 5.9999 , c'est un arrondi en fait !! :)

bon je retourne dans les doc sur Tahiti moi :)
:lol:
C'est pas ça du tout, mais bon! mdr!