Caractéristiques du langage mql5, subtilités et techniques - page 158

 

Il y a une matrice, remplie à la fois de grandes valeurs, environ 10e60, et de petites, comme 1e-40. Et il y a un code comme celui-ci

      for(k=-16;k<=16;++k)
      {
        double Tmp1=(double)(DoubleToString(Matrix[i][j],k));
        double Tmp2=(double)((string)Matrix[i][j]);
        if(Tmp1==Tmp2)
          break;
      }
Dans environ 27% des cas, k=-15. Dans les autres cas, k=-16. D'où une question : existe-t-il un moyen de remplacer l'opération(string)Matrix[i][j] par une fonction de conversion plus stricte ? Ou peut-être existe-t-il une fonction qui supprime certaines décimales ? NormalizeDouble n'est pas correct, il va tronquer 1.12345678e-40 en 0. Je veux qu'il tronque après le point décimal. Ou la conversion en (string) a sa propre vie et ne peut pas être exprimée par des fonctions ? Merci.
 
traveller00:

Le module de la différence.

 
fxsaber:

Le module de la différence.

Pourriez-vous être un peu plus précis ? Peut-être avec un exemple de code ? Différence entre quoi et quoi ?

Le fait est qu'une telle conversion double(double)((string)Matrix[i][j]); ; tronquera un nombre incontrôlable de caractères après le point décimal. Je voudrais conserver cette troncature= pouvoir la répéter d'une part, et contrôler ce nombre de caractères d'autre part.

 
traveller00:

Pourriez-vous être un peu plus précis ? Peut-être avec un exemple de code ? Différences entre quoi et quoi ?

if (MathAbs(Value1 - Value2) < Epsilon)
 

Ah, je vois votre point de vue. Non, la question est un peu différente. La comparaison ici est plutôt un exemple pour montrer que nous ne pouvons pas remplacer la conversion via (double)((string)Matrix[i][j]) ; par la conversion via DoubleToString. En fait, la tâche à accomplir n'est pas une comparaison. Il s'agit plutôt d'une certaine remise à zéro de la précision par cette double conversion. D'une part, je veux pouvoir répéter le découpage via (string), d'autre part, je veux pouvoir contrôler la précision du découpage comme le fait DoubleToString.

Et comme question secondaire, se pourrait-il que ces conversions se fassent différemment et vivent leurs vies séparées et sans lien entre elles ?

 
traveller00:

Ah, je vois votre point de vue. Non, la question est un peu différente. La comparaison ici est plutôt un exemple pour montrer que nous ne pouvons pas remplacer la conversion via (double)((string)Matrix[i][j]) ; par la conversion via DoubleToString. En fait, la tâche à accomplir n'est pas une comparaison. Il s'agit plutôt d'une certaine remise à zéro de la précision par cette double conversion. D'une part, je veux pouvoir répéter le découpage via (string), d'autre part, je veux pouvoir contrôler la précision du découpage comme le fait DoubleToString.

Et accessoirement, je me demande si ces conversions sont faites différemment et vivent leurs vies séparées et non liées.

Je ne comprends pas pourquoi NormalizeDouble etDoubleToString ne voussatisfont pas, ils ont toute la précision que vous voulez, ou vous voulez une certaine précision, mais vous ne savez pas laquelle ?

 

Je conviens que la tâche n'est pas entièrement transparente. Parce que j'essaie de mettre en place une sorte de béquille pour les tests.

Disons qu'il existe un nombre 1,0123456789e-50. J'ai besoin de l'arrondir avec une certaine précision pour que :

1. Par défaut, il fonctionne comme une double conversion via(string).

2. la précision peut être contrôlée si on le souhaite.

Par conséquent,NormalizeDouble ne convient pas, il va simplement annuler ce nombre. Et DoubleToString ne permet pas de répéter le résultat de l'étape 1.

Le problème découle de la question suivante. Comme je l'ai écrit plus haut, il existe une matrice. L'inverse de cette matrice est calculé. Parfois (peut-être en raison d'erreurs dues aux limites de précision du double), la matrice s'avère être dégénérée et l'inverse ne peut être calculé pour elle. Mais si vous réduisez un peu la précision, vous serez toujours en mesure de calculer l'inverse. C'est pourquoi j'ai voulu effectuer quelques tests et obtenir des statistiques pour savoir dans quelle mesure le résultat est similaire au résultat réel. La double conversion via (string) résout le problème dans la plupart des cas. Mais parfois, ce n'est pas suffisant et j'aimerais pouvoir contrôler le degré de précision de la coupe. Et DoubleToString, même avec une précision de -16 à 16, ne résout pas le problème dans la plupart des cas.

 

Pouvez-vous me dire s'il vous plaît, s'il vous plaît.

Dans l'indicateur, l'ordre des séries, par exemple close[], est défini par ArraySetAsSeries() une fois ou d'une autre manière ?

Est-ce que cela est fait dans OnCalculate() ou est-ce que cela peut être fait dans OnInit() ?

J'ai rencontré une situation confuse :

L'ordre dans close[], fixé par AS_SERIES à l'entrée sur le premier tick, sur le tick suivant passe spontanément à la normale, c'est-à-dire !AS_SERIES.

Je n'ai pas trouvé de raison de faire cela dans le code.

 
Yurixx:

Pouvez-vous me dire s'il vous plaît, s'il vous plaît.

Dans l'indicateur, l'ordre des séries, par exemple close[], est défini par ArraySetAsSeries() une fois ou d'une autre manière ?

Est-ce fait dans OnCalculate() ou dans OnInit() ?

J'ai rencontré une situation confuse :

L'ordre dans close[], fixé par AS_SERIES à l'entrée sur le premier tick, sur le tick suivant passe spontanément à la normale, c'est-à-dire !AS_SERIES.

Je n'ai pas trouvé la raison de cela dans le code.

Et vous ne verrez pas le tableau close[] dans OnInit(). Et aucun des autres paramètres prédéfinis de OnCalculate().

D'où la conclusion - uniquement dans OnCalculate().

 
Artyom Trishkin:

Et dans OnInit() vous ne verrez pas le tableau close[]. Et aucun des autres paramètres prédéfinis de OnCalculate().

D'où la conclusion - uniquement dans OnCalculate().

Je suis arrivé à la même conclusion. )))

Il reste à savoir si le fait de fixer cet ordre une fois est suffisant ou s'il faut le faire à chaque tick.

Raison: