• 締切済み

足し算の計算速度

こんにちは。 足し算の計算速度を測ってみました。 すると、全く同じ条件で、足す値だけ変えてみると 計算速度が変わりました。 具体的には、ガウス分布を単純に台形公式で積分したのですが、 積分範囲と平均値を固定して、分散を小さくすると 積分時間が異常に長くなりました。 小さい値(10e-200)とかの足し算は遅くなるのですか? また、理由もあれば教えていただけないでしょうか? 宜しくお願いします。

みんなの回答

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.5

再度No.2 です。 No.3 さんの回答に戸惑ってしまいました。他の回答者さんの回答に補足するのは気が引けたのと、確認する時間が必要でした。 Intel の Pentium4 のデータシートで確認しましたが、少なくとも FADD に関しては1クロック(正確にはパイプラインなので1クロックという表現は微妙ですが)でした。 No.3 さんがご指摘は、処理としては全く正しいのですが、昔よりも複雑なハードが設計できるようになった結果、現在の大半のプロセッサでは浮動小数点の積および和に関しては1クロックでできます。 さて、質問者さんの質問にもどりますが、私も惑わされていましたが、どうして「足し算の計算速度」の問題となったのでしょう?補足で示されたプログラム片では「かけ算」もあるようですが。 ついでながら、割り算に関しては、割り算を全て行う回路は未だ発明されていませんので、遥かに時間がかかります。Pentium 4 で 30 クロック前後掛かるようです。ただ最近はコンパイラが賢いので不必要な割り算コードが多く出ているとは考え難いです。数値計算で一番問題になるのはキャッシュの効率ですね。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.4

No.3の追加です。 5.3e10+(-2.99e10)の場合、(3-2.99)e10=0.01e10=1e8ですが、最後の0.01e10=1e8の変換に時間がかかります。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.3

float,doubleの場合、指数部の等しい数の加算と、指数部が違う場合で計算速度が違います。 実際は2進数ですが、説明の都合上10進数で説明します。 1.3e10+4e10の場合、(3+4)e10=7e10で計算できます。 2.3e10+8e10の場合、(3+8)e10=11e10=1.1e11ですが、最後の11e10=1.1e11の変換に時間がかかります。 3.3e10+4e20の場合、(0.0000000003+4)e20=3.0000000003e20としなければ計算できません、3を0.0000000003に変換するのに時間がかかります。 4.3e10+10e-200の場合、答えは3e10ですので計算しません。 要するに、指数部がある程度近い場合などの時に遅くなります。

  • chirubou
  • ベストアンサー率37% (189/502)
回答No.2

足し算自体は基本的には1クロックで計算できるはずで、足す/足される数の値によって計算時間が変わることはありません。 ただし、値がキャッシュに入っているかどうかでは、計算速度に大きな差がでます。ひとつのプログラムの実行の中で、条件を替えるような場合、1回目の実行でキャッシュにデータが乗るため、2回目以降では計算速度が速くなったりします。これをさけるには、一番最初に計測しないで、1回実行してから(これでキャッシュに乗る)、計測するといいと思います。ただ、キャッシュという観点からすると、積分範囲が小さい方が有利になるハズなので、今回の原因とは違うかもしれません。 計算速度の計測というのは結構難しいものです。Linux だとたまたま他のデーモンが動いていたりして、遅くなったりします。何回も計測して値にばらつきがあるようでしたら、これを疑ってください。正確に計測する時は、不要なデーモンは停止させるか、デーモンの影響を小さくするため計算時間を十分長くする必要があります。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

コンパイラと実行環境、それに実際に足し算を行っている部分のソースコード(およびそこに現れるオブジェクトの型)を補足してください。 また、計算速度の計測方法も補足してください。

0123456789A
質問者

補足

言語がfortranなので(fortranカテはないのでこちらで聞いてしまいました) アルゴリズムを説明します。 至ってシンプルで、ループ内で再帰計算するだけです。 その中で一度だけ外部関数を呼び出します。一応ソースを書いておきます。 do i = 1,imax x1 = xmin-(xmax-xmin)*dble(i-1)/dble(imax-1) x2 = xmin-(xmax-xmin)*dble(i)/dble(imax-1) k= (func(x1)+func(x2))*(x2-x1)/2.0 res = res + k end do funcがユーザー定義の外部関数です。 i,imaxは整数、x1,x2,k,res,xmax,xminは倍精度実数変数、funcは倍精度実数関数です。 コンパイラ:mpif77(ただし並列計算は行わない) 実行環境:Linux(CPU=Pen4,Mem=2GB) 時間計測はスケジューラが計算します。 宜しくお願いします。

関連するQ&A

  • ガウス関数の規格化

    平均は0で、分散の値はきちんと具体的に出ているものとします。 ガウス関数の変数部分は速度(v)とし、マイナスの値もあります。 ガウス関数を全速度範囲で積分し、その解が1ではなく3321になるよう関数の係数を決定したいのですが、その係数をAとすると、規格化は次のような式になればよいのでしょうか? A*exp(-(v**2)/(2*(分散値)))を-∞から∞まで積分したもの=3321 非常に見にくいのですが(式がプログラム上での表記になってしまっていますが・・・)、上の式が成り立てばよろしいのでしょうか?

  • 数値積分

    数値積分で e^(-x)/√xを[0,1]の範囲で数値積分するのですが、 f(0)の値が無限になり、台形公式やシンプソンの公式が使えません。 この場合どのように解けばよいんですか?

  • 積分

    一気に答えだけを表示するシンプソンの公式と台形公式のプログラムは分かったんですが計算過程も出せるその二つのプログラムを教えてください。求めたいのは∫e^-x*xdx(0~∞)の定積分の値です。

  • 2つの正規分布を合成したらどうなるのでしょうか?

    現在大学の研究の過程で統計学を学ぶ必要がでてきました。僕自身は統計学に詳しくはないので知識のある方の回答は非常に助かります。 どうかご教授よろしくおねがいします。 平均μ、分散σで表される正規分布はf(x)=1/((√2π)σ) exp-{((x-μ)^2)/2σ^2}で表されますが 例えば互いに独立で 国語の平均点、分散を(μ1,σ1)としての正規分布f(国語) 数学の平均点、分散を(μ2,σ2)としての正規分布f(数学) とした時の国語と数学の合計得点の分布f(国語+数学)はどのように表せばよいのでしょうか? もしμ3=μ1+μ2,σ3=σ1+σ2のように平均も分散も和で考えてよいのなら f(国語+数学)=1/((√2π)σ3) exp-{((x-μ3)^2)/2σ3^2} が答えだと思っているのですが、それとは別のやり方で f(国語)=1/((√2π)σ1) exp-{((x-μ1)^2)/2σ1^2}と f(数学)=1/((√2π)σ2) exp-{((x-μ2)^2)/2σ2^2}をたたみこみ積分すれば答えがでるのではないかと考えています。 しかし、僕の数学の知識ではこれができなくて困っています。ガウス積分の公式を使ったりしなければいけないのではないかとも考えいるのですが行き詰っています。 アドバイスよろしくお願いいたします。

  • 積分の計算がわかりません

    y=∫d/dx { exp(-x^2/a^2) } dx (積分範囲は-∞~∞) この場合ってどのようにすればいいんでしょうか。 ガウス積分の公式を用いて答えを導きだしたいのですが、上手くいきません。 部分積分を使うんでしょうか? よろしくお願いします。 

  • パラメータが9個ある関数(ガウス分布)の最小二乗法による近似

    ある画像から輝度ヒストグラムを取ったところ3つのガウス分布が重なっているような形状になりました。 これをサンプルデータとし、それを3つのガウス分布の和で近似しようと考えています。 求めたいパラメータはガウス分布A・B・Cの高さh1・h2・h3、平均値μ1・μ2・μ3、分散σ1・σ2・σ3です。 最小二乗法により解こうと考えましたが9元連立方程式となり、指数関数の内外にパラメータが入っており、1つの方程式自体長くなっていることにより解くことが困難です。 パラメータを求める上での条件は3つです。 ・サンプルデータを1つのガウス分布で近似しその差を取り、さらにその差をガウス分布で近似し差を取り、再びガウス分布で近似するといった方法を取らない ・h1・h2・h3は必ず正の値をとる ・パラメータはあらかじめおおよその値を予想できない これらの条件の下で解くことは可能でしょうか。 もし可能ならその解き方を教えてください。 この時、いくつかの解法の仕方がある場合はできるだけ簡単かつ計算量の少ないものを教えてください。 よろしくお願いします。

  • ベイズ統計の練習問題について

    ベイズ統計の練習問題のについてお尋ねします。 問題:1袋100g表示の袋が数多くあり、3つのサンプルを取り出して計測すると100,102,104gだったとします。 この袋の重さは分散1の正規分布であることが分かっている場合、袋の重さの事後分布を求めなさい。 ベイズの式は事後分布∝尤度×事前分布ということで、尤度と事前分布を求めて式を変形するようです。 回答によると 尤度:正規分布の式(平均=μ,分散1)に100,102,104のそれぞれを代入して得た表示式の積を取る。 事前分布:値100に対する正規分布(平均=μ,分散1)の値(表示式) として進めていきます。 ここで質問ですが、正規分布(確率密度関数)の式の値に積極的な意味があるのかなという気がして、どういうことなのだろうと思います。 確率密度関数はそれを積分したときに確率が表示されるものであり、積分しないと物理的な意味がないような気がするのですが。 さらに回答を読むと、事前分布について分散1に限定かと思ったら事前分布は未知なので(←いつもそう言われますが)分散を3にして計算してみる、ということになっています。これはなぜでしょうか。 3にしてみるという試行の結果を示すだけで回答が成立するものなのでしょうか。定期試験などで。3でないといけない理由が見出だせないのですが。 よろしくお願いします。

  • ガウス分布に従う速度の決定(Fortran)

    Fortranを用い、ガウス分布に従うように各粒子の速度の初期値を決定したいのですが、どうすればいいのでしょうか? 速度分散はすでに決定してあります。 確率密度関数も出せます。 それらから、具体的にどう速度を決定させればいいのでしょうか? 具体的なプログラム文、もしくはそれが載っているサイト等を教えてくれるとかなり嬉しいです。 そうじゃなくても、ある程度の助言があればお聞きしたいです。 よろしくおねがいします。

  • 正規分布の密度関数について

    f(x)を平均μ、分散σ^2の正規分布の密度関数とするとき、 ∫e^θx・f(x)dx (θは定数) 積分の範囲は [∞,-∞]とします。 この計算式の表す意味とはなんなのでしょうか。 ∫(x-μ)^n・f(x)dxがn次のモーメントを表す計算ということはなんとなく理解しました。 ただ、e^θxをf(x)にかけると何が起こっているのかわかりません。いったい何なのでしょうか。 また、これは統計学のどのような分野で、教科書のどの項目を見れば載っているのか教えてください。

  • 統計学の中の積分計算

    以下の積分計算を教えてください。 f(x)=1/√(2π)・e^(-1/2・z^2)を、[-0.08、6.55]の範囲で積分すると答えは何になりますか。 e(ネイピア数)で、式は確率変数Z(標準正規変量)の標準正規分布です。 宜しくお願い致します。

専門家に質問してみよう