Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Pouvez-vous m'envoyer le lien ?
Je ne l'ai pas gardé. Mentionné sur le forum ici. J'ai cherché dans les moteurs de recherche moi-même.
Je ne l'ai pas gardé. Mentionné sur le forum ici. J'ai cherché moi-même dans les moteurs de recherche.
Il est évident que toutes ces motos ont été reconstruites plusieurs fois. Des livres ont même été publiés, jusqu'aux implémentations asm.
Aujourd'hui, les bases sont difficiles à trouver, car presque tout le monde utilise des API pertinentes pour toutes les occasions.
Il suffit donc de s'inscrire sur les forums et de se renseigner.
Il est évident que toutes ces motos ont été reconstruites plusieurs fois. Des livres ont même été publiés, jusqu'à et y compris des implémentations asm.
Aujourd'hui, les bases sont difficiles à trouver, car presque tout le monde utilise des API pertinentes pour toutes les occasions.
Il suffit donc de s'inscrire sur les forums et de demander.
Pourquoi n'utilisez-vous pas LONG_MAX/MIN? Ce serait plus joli d'une certaine façon. C'est joli, je trouve. J'ai fait vos tests avec gcc (avec des modifications minimes, bien sûr, le compilateur est très ancien 5.4.0, ce que j'avais sous la main) :
Eh bien, oui, ce n'est pas gentil. MaisLONG_MAX= 9223372036854775807 est supérieur à 9007199254740992. Et la forme hexadécimale de ce nombre - 0x20000000000000 est rejetée car elle ne doit être utilisée que pour le type ulong. Je ne sais même pas comment le rendre plus clair. Je ne peux pas écrire (ulong)(1<<53) car c'est une opération qui prend du temps.
Le type double commence à contenir des entiers sans parties fractionnaires non pas à partir de la valeurLONG_MAX mais à partir de la mantisse maximale possible. Mais 53 bits sont autorisés pour la mantisse, c'est-à-dire 2^53=9007199254740992.
Votre code de synchronisation échoue - la sortie est en milisecondes (pas en nano), et je ne comprends toujours pas pourquoi nous avons besoin de moins t0.
t0 est le temps d'un cycle complet de 1000000 passages de la somme d'un double premier
tandis que t est le temps du même cycle de la somme des mêmes valeurs doubles, mais passé par les fonctions ceil, ceil, round etc.
Je suis parti de la logique que la différence (t-t0) est le temps net passé sur ces fonctions.
Bien entendu, une plus grande objectivité ne peut être obtenue qu'en effectuant plusieurs mesures.
- En nano, je calcule sur la base du temps nécessaire pour réaliser une fonction sur 1 000 000. Exactement en nano est correct.
pavlick_:
J'ai exécuté vos tests sur gcc (avec des modifications mineures, bien sûr, le compilateur est très vieux 5.4.0, ce qui était à portée de main) :
1. Compilation avec -O3.
2. Compilation avec -Ofast
Ne pas écrire (ulong)(1<<53), car c'est déjà une opération qui prend du temps.
Cette opération ne prend pas de temps, comme toutes les opérations avec des constantes, y compris les chaînes de caractères.
Cette opération est intemporelle comme toutes les constantes, y compris les chaînes de caractères.
Wow - cool ! Merci. Et je pensais que ça comptait à chaque fois. Oui, eh bien, c'est logique, on peut déjà le calculer au moment de la compilation.
Eh bien, c'est tout alors :
Cependant, il serait plus correct d'écrireDBL_MANT_DIG au lieu de 53
Cas de gain minimal si toutes les valeurs du double sont fractionnaires.
Il s'avère donc que. Que le code MQL5 compilé fonctionne plus rapidement que même Ofast ? Je trouve difficile de croire que vous deviez avoir un compilateur 32 bits.
J'ai enlevé le moins t0 de tout (je pensais que c'était une sorte d'erreur) et ma sortie a la boucle entière mesurée, pas un seul passage. Si nous convertissons à votre forme de sortie en nanosecondes par itération (dans la première ligne "Cycle time without rounding" - nous avons la même façon de compter), nous obtenons :
Il n'y a pas beaucoup d'accélération sur gcc (et encore moins sur -Ofast). Sur mcc il y a une accélération significative à en juger par votre test, mais.. :
vous avez 985'651 sur 1'000'000 c'est-à-dire que presque toutes les itérations satisfont la condition x < MIN || x > MAX.
-Ofast désactive toutes les vérifications inf/nan, le paramètre errno, c'est-à-dire que l'arrondi nu sur le fpu est laissé. Et cet arrondi nu ne peut être mis en échec par une simple comparaison de x < MIN || x > MAX.
Il n'y a pas beaucoup d'accélération sur gcc (et encore moins sur -Ofast). Sur µl, c'est significatif.
Cependant, c'est difficile à dire. Nous avons jeté t0 pour de beaux chiffres et obtenu 20 fois la différence. Même un code supplémentaire minime sous la forme d'une boucle (+t0) fait passer un beau résultat en plusieurs dizaines de fois à un résultat moins attrayant en environ deux fois. Et que dire si ce n'est pas une simple boucle mais un véritable algorithme qui fait quelque chose d'utile ? La différence ne sera pas du tout visible, elle errera quelque part loin après la virgule et ne deviendra guère un goulot d'étranglement. Dans une application réelle, la récupération des mutex, les barrières du processeur, l'allocation de mémoire sont beaucoup plus coûteuses que l'arrondi. En somme, le jeu n'en vaut pas la chandelle, à mon avis.
Oui, la différence ne sera pas du tout visible, elle se situera quelque part bien après la virgule et il est peu probable qu'elle constitue un goulot d'étranglement. Dans une application réelle, l'utilisation de mutex, de barrières de cpu, l'allocation de mémoire sont beaucoup plus coûteux que l'arrondi. En somme, le jeu n'en vaut pas la chandelle, à mon avis.
C'est vrai 99% du temps, oui.
Avant d'optimiser, vous devez vous assurer que vous avez quelque chose à optimiser.
Dans ma pratique, je ne me souviens que d'un seul cas où ma propre mise en œuvre d'atof m'a vraiment aidé. Bien qu'il me semblait que c'était le cas.
Et vous devez garder à l'esprit que toute optimisation (sauf ***) n'est pas gratuite.