問題タブ [epsilon]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - .NET Math.Log10() は、マシンによって動作が異なります
走っていることがわかりました
-324
マシン Aについては戻りますが-Infinity
、マシン B では戻ります。
彼らは元々、 を返すことで同じように振る舞いました-324
。
どちらのマシンも、最初は同じ OS (WinXP SP3) と .NET バージョン (3.5 SP1) を使用していました。マシン B で Windows の更新が行われた可能性がありますが、それ以外の変更は発生していません。
行動の違いを説明できるものは何ですか?
コメントでの議論からの詳細:
- マシン A の CPU は 32 ビット Intel Core Duo T2500 2 GHz
- マシン B の CPU は 32 ビット Intel P4 2.4 GHz
- 複数のサードパーティ コンポーネントを使用して、大規模なアプリケーションで実行されているコードから収集された結果。ただし、同じ .exe およびコンポーネント バージョンが両方のマシンで実行されています。
Math.Log10(double.Epsilon)
マシン B の単純なコンソール アプリケーションで印刷すると、-324
ではなく が印刷されます。-Infinity
- 両方のマシンの FPU コントロール ワードは常に
0x9001F
( で読み取られます_controlfp()
) です。
更新: 最後のポイント (FPU コントロール ワード) はもはや真実ではありません: _controlfp() の新しいバージョンを使用すると、異なるコントロール ワードが明らかになり、一貫性のない動作が説明されました。(詳細については、以下の rsbarro の回答を参照してください。)
visual-studio-2008 - Visual Studio でのバグのある浮動小数点処理?
最後に更新があります!
少し話があります。
MS Visual Studio 2008 (64 ビット PC の Windows 7 で実行) でコンパイルされた C プログラムで、マシンのイプシロン (条件 1.0 + イプシロン = 1.0 を満たす最大のイプシロン > 0) を計算したかったのです。double と float の精度が異なることを知っているので、両方の答えを見たかったのです。そのため、次のプログラムを作成しました。
2.22045e-16 という double 型と float 型の両方に対して同じ答えが得られたことに非常に驚きました。double は float の 2 倍のメモリを占有し、より正確なはずなので、これは奇妙でした。その後、ウィキペディアを調べて、そこからサンプル コードを取得しました。
それが正しく機能したとき、私はさらに驚きました!2 つのプログラムの基本的な違いを理解しようと何度か試みた後、次の事実がわかりました。ループ条件を
まあ、それはあなたが言う謎です。ああ、本当の謎は次のとおりです。比較:
正解(1.19209e-07)と
float では正しくなく、double では正しい答えが得られました (2.22045e-16)。
実際、それは完全に間違っています。結果は逆になるはずです。これは、デフォルトで 1.0 のような定数が (標準に従って) コンパイラによって double として扱われ、それが算術式に存在する場合、他のすべてのオペランドが double に昇格されるためです。逆に、1.0f を書き込むと、すべてのオペランドが float になり、昇格は行われません。それでも、まったく異なる結果が得られます。
これらすべてのテストの後、gcc を使用して Linux でプログラムを実行してコンパイルしようとしました。当然のことながら、私が期待したとおりに印刷されました(正解)。したがって、これは Visual Studio のバグだと思います。皆さんを笑わせるために (その瞬間まで私の投稿を読んだ人がいるとしたら、何が疑わしいのでしょう ^_^) 別の比較を行います。
これはVSでは正しく動作しませんが...
1.19209e-07 の正解が得られます。
問題の根源はバグのある VS 2008 コンパイラであるという私の正しさを誰か教えてください (あなたのマシンでバグを確認できますか?)。また、新しいバージョンの MS VS 2010 でケースをテストしていただければ幸いです。ありがとうございます。
アップデート。 MS Visual Studio 2013 では、私が言及した最初のプログラムは予期しない結果なしで動作します。float と double に対して適切な答えが得られます。これをすべての浮動小数点モデル (正確、厳密、高速) で確認しましたが、何も変わりませんでした。したがって、この場合、VS 2008 にはバグがあったようです。
c++ - フロート数値エラー。C ++は0.99999982が1であることをどのように認識しますか?
ベクトルを正規化すると、その長さは1になります。ただし、長さメソッドの結果は0.99999982です。
それが正しいか間違っているかはわかりません。しかし、それを印刷すると、結果は1になります。0.99999982ではありません(coutによって印刷されます)
しかし、std :: coutはそれが1であることをどのように知っていますか?[これが私の最初の質問です]
そして別の質問は、関数を比較した結果がなぜ偽であるかということです。
以下のような比較方法があります。また、lhsはベクトルの長さであり、rhsはちょうど1です。
return (fabsf(rhs-lhs) <= FLT_EPSILON) ? true : false;
このメソッドの結果はfalseです。
正規化されたベクトルの長さは、正規化されたと見なされるのはすでに間違っていますか?またはイプシロンが小さすぎますか?
私は何を間違えましたか?
python - 変化するリストの最後の 1000 個の値の最小値と最大値
反復アルゴリズム (モンテカルロ法) を作成しています。アルゴリズムは反復ごとに値を返し、値のストリームを作成します。
これらの値を分析し、1000
返された値がepsilon
.
最後の値のmax
との値の計算を実装してから、この式を使用して を計算し、:と比較することにしました。そして、この条件に達したら、反復を停止して結果を返します。min
1000
error
(max-min)/min
epsilon
error<=epsilon
最初の頭脳明晰なアイデアは、それに新しい値を使用し、
list
追加append
するたびに最後の値のmax
and値を計算することでした。min
1000
1000
次に、最後の値をこれ以上保持しても意味がないと判断しました。を思い出しましたdeque
。deque
オブジェクトの両端での追加と削除の複雑さはO(1)
.min
しかし、各反復で最後の 1000 個の値をすべて調べてとを計算する必要があるという問題は解決しませんでしたmax
。heapq
それから、モジュールがあることを思い出しました。常に最小のものを効率的に返すようにデータを保持します。しかし、最小のものと最大のものの両方が必要です。さらに1000
、アルゴリズムの最後に返された要素を保持できるように、要素の順序を保持する必要がありheapq
ます。
これらすべての考えを念頭に置いて、私はここで質問することにしました:
このタスクを最も効率的に解決するにはどうすればよいですか?
java - その精度のためのJavaテスト番号
Math.atan() を使用せずに ArcTan を計算するメソッドを作成する必要
があります。私のアルゴリズムは機能していますが、停止していません。
23 回ループした後、私のアルゴリズムは Math.atan() とほぼ同じ arcTan を計算しましたが、while は止まりません。
停止条件を正しい方法で指定するにはどうすればよいですか?
理解を深めるために、私のループの出力を参照してください。
1 番目の列はカウンター変数 n
2 番目の列は計算された arcTan です - ループ 23 の後で正確になっていないことがわかります
3 番目の列は私の Epsilon です
2 番目の列が 3 番目の列で指定された精度を持っているかどうかを確認するにはどうすればよいですか?
floating-point - 機械精度の見積もり
倍精度浮動小数点数の計算機イプシロンは2^-53であると言う人もいれば、他の(より一般的には)2^-52と言う人もいます。私は、1以外の整数を使用してマシンの精度を推定し、上下から(matlabで)アプローチすることをめちゃくちゃにして、結果として両方の値を取得しました。実際に両方の値を観察できるのはなぜですか?常に2^-52前後のイプシロンを生成するはずだと思いました。
excel - MicrosoftExcelで計算機イプシロンを入手する
これは、一般的なExcelユーザーだけでなく、プログラミングの経験がある人に向けた質問のようです。したがって、スーパーユーザーではなく、ここで質問します。
イプシロン(つまり、Excelの計算で表現できる最小の非ゼロ数)を返す方法はありますか?できれば関数を使用してください。関数を介して取得できない場合、コンパクトな関数を使用して計算する簡単な方法はありますか?
明確にするために、私はVBAベースのソリューションを探していません。マクロを実行する必要のない、Excelの数式/スプレッドシートベースのソリューションが必要です。
オンラインでの私の検索では、シンボルイプシロンを表示する方法についての議論がほとんどでした。
ありがとう。
python - Python のイプシロンの値
Pythonでイプシロンの標準値(または取得方法)はありますか? 浮動小数点値を比較する必要があり、可能な限り小さい差と比較したい。
C++ にnumeric_limits::epsilon( )
は、任意のデータ型のイプシロン値を与える関数が用意されています。Pythonに同等のものはありますか?
matlab - 非常に小さい値でMATLABの関数を計算する
次の関数を計算するために、MATLABで関数を作成しています。
この関数には次のものがあります。
これは、関数のmatlabでの私の実装です。
非常に小さい値で関数をテストすると、実際に関数の制限は1になりますが、数値が非常に小さい場合(たとえば、1 * e-20)、制限はゼロになりますか?この現象の説明は何ですか?私は何か間違ったことをしていますか?
c++ - 別の変数の相対値によって 1 つの変数を決定する方法は?
現在Arduinoを使用して構築しているロボットにPID制御アルゴリズムを実装しています。
私の質問は、プログラミングのロジックに関連しています。
変数、エラー、int eps を計算する必要があります。この eps は -7 から +7 の間になります。
ロボットから、0 から 7000 までの値を持つ double の形式で入力を取得します。
私のアルゴリズムは次のように動作する必要があります。
等々...
つまり、入力が含まれる間隔によって決定される値を eps に割り当てる必要があります。
私の質問は、これを行う最も効率的で、時間とリソースを節約する方法は何ですか?
私は Eclipse ではなく、Arduino と独自の IDE を使用しています。