浮動小数点演算でエラーが発生する理由についての簡単な説明
この記事では、Python を例として、浮動小数点演算でエラーが発生する理由について説明します。エラーが発生する可能性がある状況を紹介してください。そしてそれをどうやって解決するのか?お役に立てば幸いです。
[関連する推奨事項: Python3 ビデオ チュートリアル ]
コードを作成するときは、いわゆる浮動小数点エラーに遭遇することがあります。浮動小数点エラーの穴に足を踏み入れていないのであれば、それは幸運すぎるとしか言えません。
以下の Python の図を例に挙げます。0.1 0.2
は 0.3
と等しくなく、8.7 / 10
も ## と等しくありません。 #0.87、でも
0.869999…、とても奇妙です
コンピュータはどのように整数を格納するのでしょうか。 ( 整数)
浮動小数点エラーが存在する理由を説明する前に、まずコンピューターが整数 を表すために 0 と 1 をどのように使用するかについて説明しましょう。誰もがバイナリを知っておく必要があります。 101 は $2^2 2^0$ (つまり 5) を表し、
1010 は $2^3 2^1$ (つまり 10) を表します。
0000 です。 ..0000 は 0 で、最大値
1111...1111 は $2^{31} 2^{30} ... 2^1 2^0$、つまり 4294967295## を表します。
# 順列と組み合わせの観点から見ると、各ビットは 0 または 1 になる可能性があるため、変数全体の値には $2^{32}$ の可能性があり、
0 から $2 を表現できます。 ^ {23} - 1$ の間の任意の値 (エラーなし)。
浮動小数点0 から $2^{23} - 1$ までの整数はたくさんありますが、最終的には
Limitedだけです。 $2^{32}$ ほどありますが、浮動小数点数は異なります。次のように考えることができます。1 から 10 までの整数は 10 個しかありませんが、 A は無限にあります。 5.1、5.11、5.111 などの浮動小数点数のリストは無限にあります。 しかし、32 ビット空間には 23² 個の可能性しかないため、すべての浮動小数点数をこの 32 ビット空間に詰め込むために、多くの CPU メーカーがさまざまな浮動小数点数表現方法を発明してきました。 CPUごとにフォーマットが異なると面倒なので、最終的に浮動小数点演算の一般的な規格としてIEEEが発行したIEEE 754が使われ、現在のCPUもこの規格に基づいて設計されています。
IEEE 754IEEE 754 では、単精度 (32 ビット)、倍精度 (64 ビット)、特殊値 (無限大、NaN) など、多くのものが定義されています。など。
標準化浮動小数点数 8.5 を IEEE 754 形式に変更する場合は、まず次のことを行う必要があります。正規化を行います。8.5 を 8 0.5、つまり $2^3 (\cfrac{1}{2})^1$ に分割し、それをバイナリで書き込んで
1000.1 にし、最後に $1.0001 として書き込みます。 \ に 2^3$ を掛けます。これは 10 進科学表記法によく似ています。
単精度浮動小数点数IEEE 754 では、32 ビット浮動小数点数は 3 つの部分に分割されます。符号)、指数、分数の合計は 32 ビット
- 指数: 中央の 8 ビットは、 指数を使用して正規化後の累乗を表します。 真の値 127
- の形式、つまり、 3 プラス 127 は 130 仮数 (小数部) に等しい: 右端の 23 ビットは 1.0001## で始まる小数部分です # つまり、
- 0001
は
1.
の後に削除されるため、8.5 を 32 ビット形式で表現すると、次のようになります:
8 と 0.5 は両方とも 2 の累乗であるため、上記の 8.5 の例は $2^3 (\cfrac{1}{2})^1$ と表現できます。したがって、精度の問題はまったくありません。
しかし、8.9 の場合、2 のべき乗を加算する方法がないため、$1.0001110011... \times 2^3$ と表現せざるを得なくなり、約 $0.0000003$ の誤差も発生します。興味があれば、IEEE-754 Floating Point Converter の Web サイトにアクセスして試してみることができます。
#倍精度浮動小数点数
#前述の単精度浮動小数点数は、わずか 32 ビットで表されます。 IEEE 754では、誤差を小さくするために浮動小数点数を64ビットで表現することも定められており、32ビットに比べて小数部が23ビットから52ビットと2倍以上拡張されているため、当然精度は向上します。たくさん。
先ほどの 8.9 を例に挙げると、64 ビットで表現するとより正確になりますが、8.9 を 2 の累乗の合計として完全に記述することはできません。小数になります。下位 16 ビットには依然としてエラーが存在しますが、単精度エラー 0.0000003
同様の状況も # のようになります。 Python の ##1.0 は
0.999...999 に等しく、
123 も
122.999...999 に等しくなります。それらは非常に小さいので、小数に入れることができないため、バイナリ形式からは、すべてのバイナリ ビットは同じになります。
浮動小数点数の誤差は避けられないため、許容しなければなりません。より一般的な処理方法:
最大許容誤差 ε (イプシロン) を設定します一部の言語では、いわゆるイプシロンが提供されます。浮動小数点誤差の許容範囲内かどうかを判断するために使用されます。Python では、epsilon の値は約 $2.2e^{-16}$
#、つまり、演算中に浮動小数点エラーが原因で問題が発生するのを避けるために、
を 0.1 0.2 — 0.3 に書き換えることができます。 0.1 プラス 0.2 を比較します。それは 0.3 に等しいですか? <code>
もちろん、システムがイプシロンを提供しない場合は、自分でイプシロンを定義して、約 2 の -15 乗に設定することもできます。
完全に使用します計算用の 10 進法 浮動小数点エラーが発生する理由は、10 進数を 2 進数に変換するプロセスで、小数部分を仮数部にすべて詰め込むことができないためです。変換時にエラーが発生した場合は、変換する必要はなく、10 進数を使用して計算を行うだけです。
Python には 10 進数というモジュールがあり、JavaScript にも同様のパッケージがあります。ペンと紙を使って 0.1 0.2 を間違いや間違いなく計算できるのと同じように、10 進数で計算を実行するのに役立ちます。
10 進数を使用して計算すると浮動小数点数のエラーを完全に回避できますが、Decimal の 10 進数計算がシミュレートされるため、最下位レベルの CPU 回路では 2 進数が使用されます。ネイティブの浮動小数点演算よりもはるかに遅いため、すべての浮動小数点演算に Decimal を使用することはお勧めできません。
プログラミング関連の知識について詳しくは、
プログラミング入門以上が浮動小数点演算でエラーが発生する理由についての簡単な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

CentOSシステムでのPytorchモデルの効率的なトレーニングには手順が必要であり、この記事では詳細なガイドが提供されます。 1。環境の準備:Pythonおよび依存関係のインストール:Centosシステムは通常Pythonをプリインストールしますが、バージョンは古い場合があります。 YumまたはDNFを使用してPython 3をインストールし、PIP:sudoyumupdatepython3(またはsudodnfupdatepython3)、pip3install-upgradepipをアップグレードすることをお勧めします。 cuda and cudnn(GPU加速):nvidiagpuを使用する場合は、cudatoolをインストールする必要があります

Pytorch GPUアクセラレーションを有効にすることで、CentOSシステムでは、PytorchのCUDA、CUDNN、およびGPUバージョンのインストールが必要です。次の手順では、プロセスをガイドします。CUDAおよびCUDNNのインストールでは、CUDAバージョンの互換性が決定されます。NVIDIA-SMIコマンドを使用して、NVIDIAグラフィックスカードでサポートされているCUDAバージョンを表示します。たとえば、MX450グラフィックカードはCUDA11.1以上をサポートする場合があります。 cudatoolkitのダウンロードとインストール:nvidiacudatoolkitの公式Webサイトにアクセスし、グラフィックカードでサポートされている最高のCUDAバージョンに従って、対応するバージョンをダウンロードしてインストールします。 cudnnライブラリをインストールする:

DockerはLinuxカーネル機能を使用して、効率的で孤立したアプリケーションランニング環境を提供します。その作業原則は次のとおりです。1。ミラーは、アプリケーションを実行するために必要なすべてを含む読み取り専用テンプレートとして使用されます。 2。ユニオンファイルシステム(UnionFS)は、違いを保存するだけで、スペースを節約し、高速化する複数のファイルシステムをスタックします。 3.デーモンはミラーとコンテナを管理し、クライアントはそれらをインタラクションに使用します。 4。名前空間とcgroupsは、コンテナの分離とリソースの制限を実装します。 5.複数のネットワークモードは、コンテナの相互接続をサポートします。これらのコア概念を理解することによってのみ、Dockerをよりよく利用できます。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

CentOSでPytorchバージョンを選択する場合、次の重要な要素を考慮する必要があります。1。CUDAバージョンの互換性GPUサポート:NVIDIA GPUを使用してGPU加速度を活用したい場合は、対応するCUDAバージョンをサポートするPytorchを選択する必要があります。 NVIDIA-SMIコマンドを実行することでサポートされているCUDAバージョンを表示できます。 CPUバージョン:GPUをお持ちでない場合、またはGPUを使用したくない場合は、PytorchのCPUバージョンを選択できます。 2。PythonバージョンPytorch

MINIOオブジェクトストレージ:CENTOSシステムの下での高性能展開Minioは、Amazons3と互換性のあるGO言語に基づいて開発された高性能の分散オブジェクトストレージシステムです。 Java、Python、JavaScript、Goなど、さまざまなクライアント言語をサポートしています。この記事では、CentosシステムへのMinioのインストールと互換性を簡単に紹介します。 Centosバージョンの互換性Minioは、Centos7.9を含むがこれらに限定されない複数のCentosバージョンで検証されています。

NGINXのインストールをインストールするには、次の手順に従う必要があります。開発ツール、PCRE-Devel、OpenSSL-Develなどの依存関係のインストール。 nginxソースコードパッケージをダウンロードし、それを解凍してコンパイルしてインストールし、/usr/local/nginxとしてインストールパスを指定します。 nginxユーザーとユーザーグループを作成し、アクセス許可を設定します。構成ファイルnginx.confを変更し、リスニングポートとドメイン名/IPアドレスを構成します。 nginxサービスを開始します。依存関係の問題、ポート競合、構成ファイルエラーなど、一般的なエラーに注意する必要があります。パフォーマンスの最適化は、キャッシュをオンにしたり、ワーカープロセスの数を調整するなど、特定の状況に応じて調整する必要があります。
