問題タブ [exp]
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++ - double exp(double) が予期せず NaN を返す (float オーバーフローなし)
プランクの法則に従って、次のように黒体放射の実装に取り組んできました。
float[max-min+1] 配列があり、static const int max=780、static const int min = 380 です。単に配列を反復処理し、BlackBody が波長に対して与えるものを入力します (波長 = array-インデックス + 分)。IntensitySpectrum::BlackBody はこの反復を実行しますが、min と max は両方とも静的メンバー変数であり、配列も IntensitySpectrum 内にあります。
問題は、線スペクトル.BlackBody() が配列の 0 番目の要素を NaN に設定し、0 番目のみを設定することです。また、最初の反復では発生しませんが、xc>=10 である以降の反復ではすべて発生します。
VS デバッガーからのテキスト: Spectrum = {intensity=0x009bec50 {-1.#IND0000, 520718784., 537559104., 554832896., 572547904., 590712128., 609333504., ...} }
エラーを追跡したところ、::BlackBody() 関数の exppart が NaN になり、引数が 2.0 に近いにもかかわらず、基本的に exp() は NaN を返すため、明らかにオーバーフローしません。ただし、配列インデックス 0 のみです。残りの 400 インデックスに対して魔法のように機能し始めます。
メモリオーバーランがそのようなことを引き起こす可能性があることは知っています。そのため、メモリ処理を再確認しました。私は別の自作ライブラリから Vec3 をリンクしていますが、これははるかに大きく、エラーが含まれている可能性がありますが、Vec3 から使用するものはメモリとは何の関係もありません。
何時間も経った後、私は完全に無知です。他に何がこれを引き起こす可能性がありますか? オプティマイザまたは WINAPI が私を騙していませんか? (ええと、はい、プログラムは WINAPI でウィンドウを作成し、WM_PAINT で私のコードを呼び出すほぼ空の WndProc を使用します。)
事前にご協力いただきありがとうございます。
わかりづらくてすみません。これはレイアウトです:
c - 事前計算指数 (exp) テーブル
word2vecプロジェクトのコードを理解しようとしています。私が参照しているファイルはword2vec.cです。コードのスニペットは次のとおりです。
これらの値を事前計算することの利点は明らかではありません。誰か説明してくれませんか?
c - LinuxのNASMでC関数「Exp」を適切に使用するにはどうすればよいですか?
LinuxのNASMでC関数「exp」を実装しようとしています。この関数は double 値 x を取り、double 値 r = e^x を返します。ここで、e はオイラー数です。これは私の実装です:
コンパイルしようとすると、次のようになります。
これは、「extern exp」がうまく機能しているように見えるため、実際にexpを呼び出すときを指しています。私は間違って何をしていますか?
c - 関数 e^(-x) および e^(-x^2) を C での計算用の関数に渡します。
e^(-x)
関数を とe^(-x^2)
という別の関数に渡すプログラムを作成する必要がcalculateIntegral()
あります。この関数は、関数の積分を計算します。
制限:
calculateIntegral()
e^(-x)
は、との両方の積分を計算するために使用される関数です。e^(-x^2)
- functionの引数として渡すことができるのは、関数、
a
および境界、および間隔の数だけです。b
calculateIntegral()
x
たとえば、関数の外側に変更して、-x
それを別の変数に割り当てて で計算することe^(x)
を考えましたが、それを別の引数として に含める必要がありますcalculateIntegral()
。
元の を変更して、それが に渡されたときに、残りの関数が計算のためにその方程式に境界を差し込む必要があるようにする方法はありますe^(x)
か?calculateIntegral()
e^(-x)
matlab - Matlab、exp関数のオーバーフロー
exp
Matlab の関数がオーバーフローしない
最大値と、オーバーフローする最小値を見つける方法を教えてください。
ありがとう!
performance - MATLAB で exp(A*x) を高速化する分析的な方法
小さな可変列ベクトルと巨大な定数行列(多くの行と少数の列)f(x)=exp(A*x)
を繰り返し計算する必要があります。言い換えれば、数は少ないが、数は多い。私の問題の次元は、exp() 部分と同じくらいの実行時間がかかるようなものです。x
A
x
A*x
A*x
テイラー展開と値の範囲の事前計算 ( の値exp(y)
の範囲が既知であると仮定)とは別に、MATLAB が独自に行っていることに関して (精度を維持しながら) 大幅に高速化することができませんでした。いくつかの値を事前に計算できるようにするために、問題を分析的に再説明することを考えています。y
A*x
たとえば、私はそれを見つけますexp(A*x)_i = exp(\sum_j A_ij x_j) = \prod_j exp(A_ij x_j) = \prod_j exp(A_ij)^x_j
これにより、事前計算exp(A)
を 1 回行うことができますが、ループで必要な累乗は、元の関数呼び出しと同じくらいコストがかかりexp()
、さらに乗算 (\prod) を実行する必要があります。
私が従うことができる他のアイデア、または見逃した可能性のある MATLAB 内のソリューションはありますか?
編集:いくつかの詳細
A
は 26873856 x 81 のサイズです (そうです、これはとても大きいです)。つまり、81 x x
1
nnz(A) / numel(A)
です。を表すために既に疎行列を使用していますが、疎行列の exp() はもはや疎ではありません。実際、私は非スパースを保存し、どちらが高速/低速であることが判明したかを計算します( x は非スパースであるため、とにかく非スパースだと思います)は sparse を持つ方法ですが、遅いです. さらに遅いバリアントは、(スパース型の非スパース行列のメモリへの影響が 2 倍になる) と(これも非スパース結果を生成します) です。0.0012
nnz(A*x) / numel(A*x)
0.0075
A
x
exp(full(A*x))
full(exp(A*x))
A*x
exp(full(A*sparse(x)))
A*x
exp(A*sparse(x))
full(exp(A*sparse(x))
はい、要素ごとの exp を計算します。それを反映するように上記の式を更新します。
もう1つの編集:私は賢くしようとしましたが、ほとんど成功しませんでした:
c++ - 複素数に対して MATLAB exp とは異なる結果を与える std::exp
スクリプトを matlab から C++ 関数にコピーしています。ただし、 exp 関数の結果は常に異なります。たとえば、次のスニペット:
MATLAB コードと同等である必要があります
しかし、そうではありません。MATLAB では -1 + 0i (これは正しい) を受け取り、C++ では -1 + -2.068231e-013*i を受け取ります。
最初はこれは一種の丸め誤差だと思っていましたが、私が使用している実際のスクリプトでは、より大きな複雑な指数関数を使用しているため、まったく異なる数値が得られます。これの原因は何ですか?これを修正するにはどうすればよいですか?
編集:オイラー式で指数関数を手動で計算しようとしました
C ++で同じ不安定な結果を得る
c++ - How to use the overloaded and original exp inside a member of a template class
I am using a template class (Pol<T>
) to calculate with polynomials and want to use a member function (.exp()
) to convert a polynomial P into its exponential e^P.
Overloading the exponential function works fine, the compiler chooses the original exponential exp(double)
if T = double
and my own if T=Pol<double>
, but in the member function I get:
I cannot use std::exp in the member function, since I am using multiple orders of polynomials like:
I could use the overloaded exponential to make a workaround, but I don't see, why it should not be possible inside the member.
Here is my code:
matlab - 数値的に安定した実装
Matlab でベクトルの正規化された指数を計算する必要があります。
簡単に書く
V の要素のオーバーフローが log(realmax) = 709.7827 より大きい。(アンダーフロー条件についてはわかりません。)
数値的な不安定性を回避するには、どのように実装すればよいですか?
更新: オーバーフローを回避する方法について、優れた回答を受け取りました。ただし、コードのアンダーフローの可能性についてのご意見をお待ちしております。