Journal de développement des smart contracts Rust (7) Calculs numériques
1. Problème de précision des opérations sur les nombres à virgule flottante
Contrairement au langage de programmation de contrats intelligents courant, Solidity, le langage Rust prend en charge nativement les opérations en virgule flottante. Cependant, les opérations en virgule flottante présentent des problèmes de précision de calcul inévitables. Par conséquent, il n'est pas recommandé d'utiliser des opérations en virgule flottante lors de l'écriture de contrats intelligents, en particulier lorsqu'il s'agit de traiter des ratios ou des taux d'intérêt impliquant des décisions économiques ou financières importantes.
Actuellement, la plupart des langages de programmation populaires représentant des nombres à virgule flottante suivent la norme IEEE 754, et le langage Rust ne fait pas exception. Le type à virgule flottante en double précision f64 est stocké sous forme de données binaires à l'intérieur de l'ordinateur.
Les nombres à virgule flottante utilisent la notation scientifique à base 2. Par exemple, le nombre décimal 0.8125 peut être représenté par le nombre binaire 0.1101 avec un nombre de bits fini. Cependant, pour un nombre décimal comme 0.7, sa conversion en nombre à virgule flottante aboutit à une représentation binaire en boucle infinie, ce qui rend impossible une représentation précise avec un nombre à virgule flottante de longueur finie, entraînant un phénomène d'"arrondi".
Supposons qu'il soit nécessaire de distribuer 0,7 tokens à dix utilisateurs, le nombre de tokens attribués à chaque utilisateur sera calculé et enregistré dans la variable result_0. Après avoir exécuté les cas de test pertinents, nous pouvons constater que la valeur de amount ne représente pas précisément 0,7, mais plutôt une valeur très proche de 0,69999999999999995559. De plus, pour l'opération de division unique amount/divisor, le résultat de l'opération deviendra également imprécis à 0,06999999999999999, et non pas à 0,07 comme prévu. Cela montre l'incertitude des opérations sur les nombres à virgule flottante.
À cet égard, nous devons envisager d'utiliser d'autres types de représentations numériques dans les smart contracts, comme les nombres à virgule fixe. Dans la rédaction pratique des smart contracts, on utilise généralement une fraction avec un dénominateur fixe pour représenter une certaine valeur, par exemple la fraction x/N, où N est une constante et x peut varier.
Dans certaines blockchains publiques, la valeur courante de N est de 10^24, c'est-à-dire que 10^24 unités minimales équivalent à 1 unité de jeton principal. Sur cette base, nous pouvons remplacer les calculs à virgule flottante par des calculs entiers afin d'obtenir des résultats de calcul plus précis.
2. Problème de précision des calculs entiers en Rust
L'utilisation d'opérations entières peut résoudre le problème de la perte de précision des opérations sur les nombres à virgule flottante dans certaines situations. Mais cela ne signifie pas que les résultats des calculs entiers sont complètement précis et fiables. Certaines des raisons qui influencent la précision des calculs entiers incluent :
2.1 Ordre des opérations
Dans les opérations arithmétiques, le changement de l'ordre des multiplications et des divisions de même priorité peut directement affecter le résultat du calcul, entraînant des problèmes de précision dans les calculs d'entiers. En ce qui concerne la division entière, la précision inférieure au diviseur sera abandonnée. Ainsi, dans certains processus de calcul, effectuer d'abord l'opération de division peut entraîner une perte de précision.
2.2 trop petit en termes d'échelle
Lorsque les valeurs concernées sont trop petites, les opérations sur les entiers peuvent également rencontrer des problèmes de précision. Par exemple, dans certains cas, effectuer des opérations sur les entiers directement et effectuer des opérations après avoir introduit un ordre de grandeur plus élevé peuvent donner des résultats différents.
3. Comment rédiger des smart contracts Rust pour l'évaluation numérique
Pour garantir la précision des calculs dans les smart contracts, les mesures de protection suivantes peuvent être prises :
3.1 Ajuster l'ordre des opérations
Essayez de faire en sorte que la multiplication des entiers précède la division des entiers.
3.2 augmenter l'ordre de grandeur des entiers
Utiliser des ordres de grandeur plus élevés pour représenter des valeurs, créer des molécules plus grandes pour participer aux calculs afin d'améliorer la précision.
3.3 perte de précision dans les calculs accumulés
Pour les problèmes de précision de calcul des entiers inévitables, il peut être envisagé d'enregistrer la perte de précision cumulée. Lors des calculs ultérieurs, ces pertes doivent être prises en compte afin d'obtenir une répartition des résultats plus équitable.
3.4 Utilisation de la bibliothèque Rust Crate rust-decimal
Cette bibliothèque est adaptée aux scénarios de calcul financier à virgule flottante nécessitant une haute précision et sans erreur d'arrondi.
3.5 Considérer le mécanisme de rounding
Lors de la conception de smart contracts, les problèmes d'arrondi suivent généralement le principe "en faveur de soi, au détriment des autres". Choisissez le mode d'arrondi approprié, que ce soit un arrondi à l'inférieur, à l'inférieur ou une autre méthode d'arrondi selon la situation.
En prenant ces mesures, il est possible d'obtenir des calculs numériques plus précis dans les smart contracts Rust, évitant ainsi les erreurs ou les résultats injustes dus à des problèmes de précision.
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
13 J'aime
Récompense
13
8
Reposter
Partager
Commentaire
0/400
SeasonedInvestor
· 07-19 12:17
La précision est vraiment trompeuse.
Voir l'originalRépondre0
RugPullProphet
· 07-18 09:14
Le contrôle de la précision doit être à la hauteur.
Voir l'originalRépondre0
GasOptimizer
· 07-16 19:00
La précision, c'est la vie.
Voir l'originalRépondre0
TestnetScholar
· 07-16 18:56
Il est plus fiable d'utiliser des nombres entiers.
Techniques de calcul de valeur dans les smart contracts Rust : éviter les pièges des nombres à virgule flottante
Journal de développement des smart contracts Rust (7) Calculs numériques
1. Problème de précision des opérations sur les nombres à virgule flottante
Contrairement au langage de programmation de contrats intelligents courant, Solidity, le langage Rust prend en charge nativement les opérations en virgule flottante. Cependant, les opérations en virgule flottante présentent des problèmes de précision de calcul inévitables. Par conséquent, il n'est pas recommandé d'utiliser des opérations en virgule flottante lors de l'écriture de contrats intelligents, en particulier lorsqu'il s'agit de traiter des ratios ou des taux d'intérêt impliquant des décisions économiques ou financières importantes.
Actuellement, la plupart des langages de programmation populaires représentant des nombres à virgule flottante suivent la norme IEEE 754, et le langage Rust ne fait pas exception. Le type à virgule flottante en double précision f64 est stocké sous forme de données binaires à l'intérieur de l'ordinateur.
Les nombres à virgule flottante utilisent la notation scientifique à base 2. Par exemple, le nombre décimal 0.8125 peut être représenté par le nombre binaire 0.1101 avec un nombre de bits fini. Cependant, pour un nombre décimal comme 0.7, sa conversion en nombre à virgule flottante aboutit à une représentation binaire en boucle infinie, ce qui rend impossible une représentation précise avec un nombre à virgule flottante de longueur finie, entraînant un phénomène d'"arrondi".
Supposons qu'il soit nécessaire de distribuer 0,7 tokens à dix utilisateurs, le nombre de tokens attribués à chaque utilisateur sera calculé et enregistré dans la variable result_0. Après avoir exécuté les cas de test pertinents, nous pouvons constater que la valeur de amount ne représente pas précisément 0,7, mais plutôt une valeur très proche de 0,69999999999999995559. De plus, pour l'opération de division unique amount/divisor, le résultat de l'opération deviendra également imprécis à 0,06999999999999999, et non pas à 0,07 comme prévu. Cela montre l'incertitude des opérations sur les nombres à virgule flottante.
À cet égard, nous devons envisager d'utiliser d'autres types de représentations numériques dans les smart contracts, comme les nombres à virgule fixe. Dans la rédaction pratique des smart contracts, on utilise généralement une fraction avec un dénominateur fixe pour représenter une certaine valeur, par exemple la fraction x/N, où N est une constante et x peut varier.
Dans certaines blockchains publiques, la valeur courante de N est de 10^24, c'est-à-dire que 10^24 unités minimales équivalent à 1 unité de jeton principal. Sur cette base, nous pouvons remplacer les calculs à virgule flottante par des calculs entiers afin d'obtenir des résultats de calcul plus précis.
2. Problème de précision des calculs entiers en Rust
L'utilisation d'opérations entières peut résoudre le problème de la perte de précision des opérations sur les nombres à virgule flottante dans certaines situations. Mais cela ne signifie pas que les résultats des calculs entiers sont complètement précis et fiables. Certaines des raisons qui influencent la précision des calculs entiers incluent :
2.1 Ordre des opérations
Dans les opérations arithmétiques, le changement de l'ordre des multiplications et des divisions de même priorité peut directement affecter le résultat du calcul, entraînant des problèmes de précision dans les calculs d'entiers. En ce qui concerne la division entière, la précision inférieure au diviseur sera abandonnée. Ainsi, dans certains processus de calcul, effectuer d'abord l'opération de division peut entraîner une perte de précision.
2.2 trop petit en termes d'échelle
Lorsque les valeurs concernées sont trop petites, les opérations sur les entiers peuvent également rencontrer des problèmes de précision. Par exemple, dans certains cas, effectuer des opérations sur les entiers directement et effectuer des opérations après avoir introduit un ordre de grandeur plus élevé peuvent donner des résultats différents.
3. Comment rédiger des smart contracts Rust pour l'évaluation numérique
Pour garantir la précision des calculs dans les smart contracts, les mesures de protection suivantes peuvent être prises :
3.1 Ajuster l'ordre des opérations
Essayez de faire en sorte que la multiplication des entiers précède la division des entiers.
3.2 augmenter l'ordre de grandeur des entiers
Utiliser des ordres de grandeur plus élevés pour représenter des valeurs, créer des molécules plus grandes pour participer aux calculs afin d'améliorer la précision.
3.3 perte de précision dans les calculs accumulés
Pour les problèmes de précision de calcul des entiers inévitables, il peut être envisagé d'enregistrer la perte de précision cumulée. Lors des calculs ultérieurs, ces pertes doivent être prises en compte afin d'obtenir une répartition des résultats plus équitable.
3.4 Utilisation de la bibliothèque Rust Crate rust-decimal
Cette bibliothèque est adaptée aux scénarios de calcul financier à virgule flottante nécessitant une haute précision et sans erreur d'arrondi.
3.5 Considérer le mécanisme de rounding
Lors de la conception de smart contracts, les problèmes d'arrondi suivent généralement le principe "en faveur de soi, au détriment des autres". Choisissez le mode d'arrondi approprié, que ce soit un arrondi à l'inférieur, à l'inférieur ou une autre méthode d'arrondi selon la situation.
En prenant ces mesures, il est possible d'obtenir des calculs numériques plus précis dans les smart contracts Rust, évitant ainsi les erreurs ou les résultats injustes dus à des problèmes de précision.