Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Blocage boucle FOR NEXT en SINGLE

21 réponses
Avatar
Papyjac
Bonjour,

Je suis en version V2003

J'exécute le code simple suivant :

Sub TestSingle()
'_Appel de la fonction
Call TestBoucle(1000000#)
Call TestBoucle(10000000#)
Call TestBoucle(100000000#)
End Sub

Private Sub TestBoucle(Max As Single)
'_Boucle de traitement
Dim U_I As Single ' Indice
For U_I = 1 To Max Step 1
Next
MsgBox Max & " boucles effectuées"
End Sub

La 1ère et la 2ème boucle sont correcte
La 3ème boucle se bloque sur le NEXT avec U_I= 1,677722E+07

Il ne s'agit pas d'un plantage, mais d'un blocage

Bon, ce code ne sert à rien, mais c'est pas une raison pour bloquer

C'est un problème connu ?

--
Papyjac

1 réponse

1 2 3
Avatar
Jacquouille
Après le un, deux et beaucoup de certains...
Si j'osais, je te suggérerais d'aller voir les math chez les Mayas.
Drolement plus simple à écrire....
Perso, vu que je n'ai que 10 doigts, je ne te suivrai pas jusque 30.000. -)
Bonne chance.

--
Bien amicalmement,
"Le vin est au repas ce que le parfum est à la femme."

Jacquouille.

"Papyjac" a écrit dans le message de
news:
Bonjour bacr, jacquouille, michdenis, thom, mousnynao

Un grand merci pour cette passion et ces explications,

Si c'est pas hasard, que je suis tombé sur ce blocage, sachez que cela n'a
pas entammé ma confiance envers le produit, car effectivement, c'est une
configuration que je n'utilises jamais, mais je pensais que cela pouvais
vous
intéresser

Ma recherche actuelle concerne les mesure de performance de certaines
instructions avant de me lancer dans le calcul sur les grands nombres, par
exemple 30000 chiffres significatifs... sans mantisse, ni exposant bien
sur
puisque on doit toujours 1+1 = 2 depuis 0, jusqu'à
9999999999999....999999999999999999 (30000 chiffres 9)

Encore merci pour vos réponses
--
Papyjac


"bcar" a écrit :

Re-Bonjour,

pour un peu plus de précisions :

- la mantisse de 16777216 s'écrit 1000000000000000000000000 (25 bits)
alors que la mantisse d'un single ne possède que 23 bits donc on ne
conserve que les 23 bits de gauche (+1 car le premier est forcement 1
donc on l'omet dans la mantisse) et on obtient 00000000000000000000000
0 pour le bit de signe
24 pour l'exposant auquel on ajoute 127 ce qui donne 10010111
et on a donc le nombre suivant
0 10010111 00000000000000000000000

- la mantisse de 16777217 s'écrit 1000000000000000000000001 (25 bits )
....
=> 0 10010111 00000000000000000000000
donc égal à 16777216

- la mantisse de 16777218 s'écrit 1000000000000000000000010 (25 bits)
....
=> 0 10010111 00000000000000000000001
donc différent de 1677216

bcar a écrit :
> Bonjour,
>
> Le type single (comme le type double) ne représente pas tous les réels
> dans le range compris entre -3,402823E38 et 3,402823E38.
>
> En fait 16777217 n'est pas représentable par un Single, on utilise un
> nombre approché, malheureusement pour toi, ce nombre est 16777216
>
> Autrement dit avec des single ou des double tu peux très bien avoir
> Dim s1 as single, s2 as single
> s1 = ...
> s2 = s1 + 1
>
> et s1 - s2 = 0 ou s1 - S2 = 1
>
> C'est pourquoi il est recommandé de faire très attention quand on
> manipule ce genre de type de données.
>
> Je te conseille de regarder comment est représenté un nombre réel en
> informatique : Signe, Exposant, Mantisse.
>
> Papyjac a écrit :
>> Bonjour,
>>
>> Je suis en version V2003
>>
>> J'exécute le code simple suivant :
>>
>> Sub TestSingle()
>> '_Appel de la fonction
>> Call TestBoucle(1000000#)
>> Call TestBoucle(10000000#)
>> Call TestBoucle(100000000#)
>> End Sub
>>
>> Private Sub TestBoucle(Max As Single)
>> '_Boucle de traitement
>> Dim U_I As Single ' Indice
>> For U_I = 1 To Max Step 1
>> Next
>> MsgBox Max & " boucles effectuées"
>> End Sub
>>
>> La 1ère et la 2ème boucle sont correcte
>> La 3ème boucle se bloque sur le NEXT avec U_I= 1,677722E+07
>>
>> Il ne s'agit pas d'un plantage, mais d'un blocage
>>
>> Bon, ce code ne sert à rien, mais c'est pas une raison pour bloquer
>>
>> C'est un problème connu ?
>>





1 2 3