ROUND

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 30 juin 2004 à 17:57
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 - 30 juin 2004 à 21:17
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/24156-round

cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
30 juin 2004 à 21:17
ah non j'ai rien dit, j,avasi bloquer ici
Round = ((Num * NbDec) \ 1) / NbDec
mais tu réutilise la variable NbDec
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 juin 2004 à 21:06
ok pour l'OverFlow.... tout depend de la gamme de valeur....
(on peut tout passer en Double)

carement pas d'accord pour la division par 0 !!! (10^0 = 1)
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
30 juin 2004 à 20:54
envoi un 0 comme nombre de décimal et tu viens de faire une division par zéro
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 juin 2004 à 20:42
Renfield > 'Num * NbDec' ne risque pas overflow de la part de VB ?
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 juin 2004 à 20:32
ton code est lent, c'est un fait !

un gros default dans ton code :

Public Function Round(chiffre As Double, décimal As Integer) As Double
chiffre = chiffre * (10 ^ décimal)

tu modifie un des parametres d'entrée (passé par reference par defaut)


pour faire ca juste en VB, tu pourrais simplement faire :

(ca tronques, ca arrondi a rien du tout...)

Public Function Round(Num As Long, ByVal NbDec As Long) As Long
NbDec = (10 ^ NbDec)
Round = ((Num * NbDec) \ 1) / NbDec
End Function
cs_dragon Messages postés 2336 Date d'inscription samedi 14 juillet 2001 Statut Membre Dernière intervention 5 mai 2009 6
30 juin 2004 à 19:10
c,est un fait que moi pis l'ASM .... faudrais vraiment que je m'achète un livre sur le sujet

BruNews, tiens ça fais un bout
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 juin 2004 à 19:07
EB si tu passes par la, comme d'hab j'ai tape trop vite, on peut nettement reduire:

bnRound PROC pdbl:DWORD
mov eax, [esp+4]
fld qword ptr[eax]
fistp dword ptr[esp+4]
mov eax, [esp+4]
ret 4
bnRound ENDP
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 juin 2004 à 17:57
ok si ce n'est appele qu'1 fois de temps en temps sinon temps de calcul redhibitoire dans une grosse boucle.
Si qlqun veut lui assembler la version en hyper rapide (EB par exemple...), je l'ai fait va impec:
-------------------------------
.model flat, stdcall
option casemap :none
option prologue:none
option epilogue:none

.code

LibMain PROC hInstDLL:DWORD, reason:DWORD, unused:DWORD
mov eax, 1
ret 12
LibMain ENDP

bnRound PROC pdbl:DWORD
mov eax, [esp+4]
fld qword ptr[eax]
frndint
push eax
fistp dword ptr[esp]
pop eax
ret 4
bnRound ENDP

End LibMain
---------------------------
ce qui donne une DLL de 2.5 Ko
Utilisation depuis VB/VBA, test fait sur Excel:

Declare Function bnRound Lib "D:\RndAsm.dll" (pdbl As Double) As Long

Sub tesRound()
Dim d As Double
d = 3.547
Debug.Print bnRound(d)
End Sub
Rejoignez-nous