2010年の更新 G95

8月17日
Dan Nagle は、C_PTR の引数を与えられたときに C_LOC が間違ったものを返すという問題を報告しました。修理済み。

8月16日
私の古いメール アドレス andyv@firstinter.net アドレスはもうありません。次回の請求で失効させるつもりだったのですが、更新ではなく処分することになったようです。とにかく、このアドレスにはスパムのオーバーヘッドが多すぎました。

6月17日
Mat Cross は、I/O ライブラリ内で valgrind の問題 (解放されたメモリの読み取り) を送信しました。修理済み。

6月16日
Doug Cox がいくつかの新しい Windows ビルドをビルドしました。

Jens Bischoff は、組み込み関数に使用したアルゴリズムの一部を説明する古い IBM fortran マニュアルを送ってくれました。いい物。

John Harper はマニュアルに訂正を送ってくれました. -fzero オプションはスカラーのみをゼロにします.

Jürgen Reuter と Elizabeth Wong は、初期化されたモジュール変数が正しく処理されない OSX の問題を報告しました。OSX のさまざまなバージョンがこれらのことを処理することが判明しました。

6月15日
John Reid さんは、実行中の coarray プログラムからの出力の書き込みに関する問題を報告しました。パイプに書き込むときは出力をバッファリングしない必要があります。

今日は erfc() の作業をもう少し。x=50 に到達しましたが、最後の 2 桁が間違っていたため、一時停止しました。しばらく頭を悩ませた後、x87 アセンブラと任意精度の python の間で計算を並べて実行しました。有理近似の分子と分母は問題なく、商は ulp まで問題ありませんでした。問題は、x87 で指数関数を計算することであることが判明しました。

私はありふれた指数関数について話しているのではなく、exp(-1000) の計算について話しているのです。これが x87 内で計算される方法は、引数を整数部分と小数部分に分割し、小数部分で 2^x を計算してから、整数部分でスケーリングすることです。exp が -1000 の場合、上位 12 ビットが整数部分です。分離後、下位 12 ビットはガベージであり、指数の下位 12 ビットもガベージとして残ります。そのため、多くの余分な努力なしでは修正できません。

6月14日
Michael Pock は、符号と実定数部分の間にスペースを含む複雑な定数について文句を言うと、g95 は厳しすぎると指摘しました。修理済み。

テストスイートを再開しました。g95 が現在検出しているエラーのため、場合によってはソースを更新する必要があり、あるケースでは、さまざまな方法で C 関数を呼び出す HDF ライブラリの古いバージョンが破棄され、あらゆる種類のエラーが発生しました。現在のバージョンは C 相互運用機能を使用していると確信しています。

Evangelos Evangelo は、修正されたアレイ リターンでクラッシュを送信しました。これは 1 時間の凝視で、半ダースの行を変更すると機能します。テストスイートが再び機能するようになったことをうれしく思います。

6月10日
erf/erfc() に関するさらなる作業。先日、たまたま erf/erfc の実装は「非自明」であると述べていた Web ページに出くわしました。|x|までです = 5. x > 6.75 では、erf(x) は 1 と区別できず、x > 110 付近では、erfc(x) < tiny(0_10) です。

発散級数は x が大きいほど良くなるため、必要な間隔が数回だけになることを願っています。私の概算がどれほど良いものかよくわからないので、ある時点で何らかの自動テストをセットアップする予定です。浮動小数点数を正確に読み書きするために費やした努力は報われています。

6月9日
今日は、ブレントの指数関数に関する昨日の投稿について少し考えていました。これを共有したかった理由の 1 つは、数値アナリストが実際にどのように機能するかを非常に例証しているからです。確かに、このような指数関数を計算している場合は、より多くのビットを投入することでいつでも問題を解決できますが、それは Richard Brent が行ったことではありません。数学を少しいじることによって、彼は指数関数の同等の表現を見つけました。これは、精度の損失があまりないことが保証された値を持つ指数べき級数、精度の損失をあまり伴わないいくつかの二乗、およびゼロのシフトを含む乗算を含みます。精度の損失。綺麗な。

より簡単な例は、ナビゲーションを含むプログラムを作成している場合です。この場合、cos(w) が 1 に近づくため、w が 0 に近い場合に (1-cos(w)) が必要になる可能性が高くなります。となり、精度が大幅に低下します。あなたもリチャード・ブレントになりきって、ゼロに近い余弦は 1 – w^2/2 であることを思い出してください! + w^4/4! – …、厄介なことに 1-cos(x) = w^2/2! – w^4/4! + … . これは、小さい w の計算が高速で簡単です。あなたのユーザーは、注意を払って北極の近くの座標を入力しても、プログラムがおかしくないことに決して気付かないでしょう。

Michael Richmond は、修正された別の INTENT(OUT) リグレッションを送信しました。

Snow Leopard バージョンの osx で g95 を使用すると問題が発生するという報告が数人から寄せられています。Alison Boeckmann は、私がビルドを進めるのをボランティアで手伝ってくれました。

John Reid さんは、修正された Web サイト上の coarray に関するいくつかの誤りを指摘しました。

Doug Cox はいくつかの新しい Windows と Debian ビルドを作成しました。

Matthew Halfant さんは、修正された実際の do-loop でのクラッシュを報告しました。

6月8日
INTENT(OUT) ダミーが設定されていないという別の 158 警告を修正しました。いくつかの重複したコードを共通のサブルーチンにまとめました。残りの問題のいくつかは、実際にはスイートの問題であり、g95 ではないようです。

erf(x)/erfc(x) に時間を割くことができました。大きな x で erfc(x) を計算する方法は、私が先日冷笑していた発散級数であることがわかりました。トリックは、それが大きな x でのみ機能することを認識し、先に進んでいる間は終了することです。したがって、0 から 1 までの erfc(x) は 1-erf(x) であり、erf(x) はベキ級数です。1 から 10 までは erfc(x) が連分数で、10 から上は発散ベキ級数です。ベキ級数は 9 くらいで動き始め、継続分数は 10 で痛くなります。2 人は 9 時から 10 時まで完全に一致しています。

また、指数関数の計算を修正して、通常のベキ級数の代わりにブレントの方法を使用する必要がありました。これは、マイナス 10 程度未満の負の引数のビットを失い始めます。erfc(100) を計算するには、exp(-100*100) = exp(-10000) が必要です。過剰に思えるかもしれませんが、種類の 10 と 16 の数は 10^{-4700} にまで下がりました。

ブレントの方法 (彼のあまり知られていない方法の 1 つ) は次のように機能します。 r = 2^{-k} (x – n log 2),

ここで、x は必要な指数で、n は必要な精度のビット数です。0 < r < log 2 となる整数 k を選択します。これは、差を計算し、浮動小数点数を仮数と指数に分けて k と r を計算することによって行われます。x を解くと、 x = r 2^k + n log 2

両辺をべき乗し、 exp(x) = 2^n exp(r)^{2k}

0 < r < log 2 であるため、ベキ級数に従うことができます。exp(r) の 2k 乗には、k 回の 2 乗が含まれます。2^n を掛けるとシフトが必要になります。これは、浮動小数点ランドでは指数に n を追加するだけです。この方法の優れた点は、ビットを失う加算や減算がないことです。

タイトルとURLをコピーしました