# Rustスマートコントラクト養成日記(7)数値精算## 1. 浮動小数点演算の精度問題一般的なスマートコントラクトプログラミング言語Solidityとは異なり、Rust言語は浮動小数点演算をネイティブにサポートしています。しかし、浮動小数点演算には避けられない計算精度の問題があります。したがって、スマートコントラクトを作成する際には、特に重要な経済的または金融的な決定に関わる比率や利率を扱う場合には、浮動小数点演算の使用は推奨されません。現在主流のプログラミング言語で浮動小数点数を表現する際は、ほとんどがIEEE 754標準に従っていますが、Rust言語も例外ではありません。倍精度浮動小数点型f64は、コンピュータ内部でバイナリデータ形式で保存されます。浮動小数点数は、基数2の科学的表記法を使用して表現されます。例えば、有限のビット数の2進数0.1101を使用して小数0.8125を表すことができます。しかし、0.7のような小数の場合、その浮動小数点数への変換プロセスでは無限ループの2進数表現が発生し、有限の長さの浮動小数点数で正確に表現することができず、「丸め」の現象が存在します。0.7個のトークンを10人のユーザーに分配する必要があると仮定した場合、各ユーザーに分配されるトークンの数量はresult_0変数に計算して保存されます。関連するテストケースを実行した後、amountの値は0.7を正確に表しているのではなく、非常に近似した値である0.69999999999999995559であることがわかります。さらに、amount/divisorの単一除算の計算結果も不正確な0.06999999999999999となり、期待される0.07ではありません。このように、浮動小数点数演算の不確実性が見て取れます。これについて、スマートコントラクト内で他のタイプの数値表現方法、例えば固定小数点数を使用することを考慮する必要があります。実際のスマートコントラクトの作成では、通常、特定の数値を表すために固定分母の分数が使用されます。例えば、分数x/Nのように、Nは定数で、xは変化可能です。一部のパブリックブロックチェーンでは、Nの一般的な値は10^24であり、つまり10^24の最小単位が1つの主要なトークン単位に相当します。これに基づいて、浮動小数点演算を整数演算に変更することで、より正確な計算結果を得ることができます。! [](https://img-cdn.gateio.im/social/moments-7bdd27c1211e1cc345bf262666a993da)## 2. Rustの整数計算の精度に関する問題整数演算を使用することで、特定のシナリオにおける浮動小数点演算の精度喪失の問題を解決できます。しかし、これは整数計算の結果が完全に正確で信頼できることを意味するわけではありません。整数計算の精度に影響を与えるいくつかの理由には、以下が含まれます:### 2.1 操作の順序同じ算数の優先順位の乗法と除法では、その前後の順序の変化が計算結果に直接影響を与え、整数計算の精度の問題を引き起こす可能性があります。整数除法に関しては、除数より小さい精度は切り捨てられます。したがって、特定の計算プロセスでは、先に除法を行うと精度が失われる可能性があります。### 2.2 小さすぎる数量級数値が非常に小さい場合、整数演算でも精度の問題が発生する可能性があります。例えば、特定の状況では、直接整数演算を行うのと、より大きな桁数を導入してから演算を行うのとでは、異なる結果が得られることがあります。! [](https://img-cdn.gateio.im/social/moments-1933a4a2dd723a847f0059d31d1780d1)## 3. 数値精算のRustスマートコントラクトの書き方スマートコントラクト内の計算精度を確保するために、以下の防護手段を講じることができます。### 3.1 操作の順序を調整する整数の乗算を整数の除算よりも優先させるようにしてください。### 3.2 整数の数量級を増加させるより大きな数量を使用して数値を表現し、計算により大きな分子を参加させて精度を向上させます。### 3.3 運用精度の累積損失避けられない整数計算精度の問題については、累積した計算精度の損失を記録することを検討できます。今後の計算において、これらの損失を考慮に入れることで、より公平な結果の配分を実現します。### 3.4 では、Rust Crate ライブラリ rust-decimal を使用しますこのライブラリは、高精度計算と丸め誤差のない小数金融計算シーンに適しています。### 3.5 丸め機構を考慮するスマートコントラクトを設計する際、丸めの問題は通常「自分に有利で他人に不利」という原則に従います。具体的な状況に応じて、切り捨て、切り上げ、またはその他の適切な丸め方法を選択します。これらの措置を講じることで、Rustスマートコントラクトにおいて、より正確な数値計算を実現し、精度の問題によるエラーや不公平な結果を回避することができます。! [](https://img-cdn.gateio.im/social/moments-6e8b4081214a69423fc7ae022d05c728)
Rustスマートコントラクト内数値精算技巧:浮動小数点数の罠を避ける
Rustスマートコントラクト養成日記(7)数値精算
1. 浮動小数点演算の精度問題
一般的なスマートコントラクトプログラミング言語Solidityとは異なり、Rust言語は浮動小数点演算をネイティブにサポートしています。しかし、浮動小数点演算には避けられない計算精度の問題があります。したがって、スマートコントラクトを作成する際には、特に重要な経済的または金融的な決定に関わる比率や利率を扱う場合には、浮動小数点演算の使用は推奨されません。
現在主流のプログラミング言語で浮動小数点数を表現する際は、ほとんどがIEEE 754標準に従っていますが、Rust言語も例外ではありません。倍精度浮動小数点型f64は、コンピュータ内部でバイナリデータ形式で保存されます。
浮動小数点数は、基数2の科学的表記法を使用して表現されます。例えば、有限のビット数の2進数0.1101を使用して小数0.8125を表すことができます。しかし、0.7のような小数の場合、その浮動小数点数への変換プロセスでは無限ループの2進数表現が発生し、有限の長さの浮動小数点数で正確に表現することができず、「丸め」の現象が存在します。
0.7個のトークンを10人のユーザーに分配する必要があると仮定した場合、各ユーザーに分配されるトークンの数量はresult_0変数に計算して保存されます。関連するテストケースを実行した後、amountの値は0.7を正確に表しているのではなく、非常に近似した値である0.69999999999999995559であることがわかります。さらに、amount/divisorの単一除算の計算結果も不正確な0.06999999999999999となり、期待される0.07ではありません。このように、浮動小数点数演算の不確実性が見て取れます。
これについて、スマートコントラクト内で他のタイプの数値表現方法、例えば固定小数点数を使用することを考慮する必要があります。実際のスマートコントラクトの作成では、通常、特定の数値を表すために固定分母の分数が使用されます。例えば、分数x/Nのように、Nは定数で、xは変化可能です。
一部のパブリックブロックチェーンでは、Nの一般的な値は10^24であり、つまり10^24の最小単位が1つの主要なトークン単位に相当します。これに基づいて、浮動小数点演算を整数演算に変更することで、より正確な計算結果を得ることができます。
!
2. Rustの整数計算の精度に関する問題
整数演算を使用することで、特定のシナリオにおける浮動小数点演算の精度喪失の問題を解決できます。しかし、これは整数計算の結果が完全に正確で信頼できることを意味するわけではありません。整数計算の精度に影響を与えるいくつかの理由には、以下が含まれます:
2.1 操作の順序
同じ算数の優先順位の乗法と除法では、その前後の順序の変化が計算結果に直接影響を与え、整数計算の精度の問題を引き起こす可能性があります。整数除法に関しては、除数より小さい精度は切り捨てられます。したがって、特定の計算プロセスでは、先に除法を行うと精度が失われる可能性があります。
2.2 小さすぎる数量級
数値が非常に小さい場合、整数演算でも精度の問題が発生する可能性があります。例えば、特定の状況では、直接整数演算を行うのと、より大きな桁数を導入してから演算を行うのとでは、異なる結果が得られることがあります。
!
3. 数値精算のRustスマートコントラクトの書き方
スマートコントラクト内の計算精度を確保するために、以下の防護手段を講じることができます。
3.1 操作の順序を調整する
整数の乗算を整数の除算よりも優先させるようにしてください。
3.2 整数の数量級を増加させる
より大きな数量を使用して数値を表現し、計算により大きな分子を参加させて精度を向上させます。
3.3 運用精度の累積損失
避けられない整数計算精度の問題については、累積した計算精度の損失を記録することを検討できます。今後の計算において、これらの損失を考慮に入れることで、より公平な結果の配分を実現します。
3.4 では、Rust Crate ライブラリ rust-decimal を使用します
このライブラリは、高精度計算と丸め誤差のない小数金融計算シーンに適しています。
3.5 丸め機構を考慮する
スマートコントラクトを設計する際、丸めの問題は通常「自分に有利で他人に不利」という原則に従います。具体的な状況に応じて、切り捨て、切り上げ、またはその他の適切な丸め方法を選択します。
これらの措置を講じることで、Rustスマートコントラクトにおいて、より正確な数値計算を実現し、精度の問題によるエラーや不公平な結果を回避することができます。
!