• 締切済み

数値の誤差

ある数値の累乗を求める(5の5乗など)プログラムを再帰関数・pow関数それぞれを使って作ったのですが、15の15乗からpow関数の結果に誤差が生じてしまいました。 知人からメモリが関係していると聞き、ネットで調べたのですが、理解できませんでした。 もしよろしければ詳しく教えていただけませんか。 よろしくお願いします。

  • --ll
  • お礼率12% (1/8)

みんなの回答

回答No.2

メモリ? 倍精度浮動小数点は以下の構成になっています。 (-1)^符号部 * 2^(指数部-1023) * (1.仮数部) 符号部:1[bit] 指数部:11[bits] 仮数部:52[bits] 計:64[bits] 例)[符号部,指数部,仮数部]で書きます 1.0は[0,1023,0000....0b] 0.5は[0,1022,0000....0b] 1.5は[0,1023,1000....0b] ○本題 15^15は 437,893,890,380,859,375 で二進数表記した場合 110 0001 0011 1011 0110 0010 1100 0101 1001 0111 0111 0000 0111 1110 1111b 式『(-1)^符号部 * 2^(指数部-1023) * (1.仮数部)』を当てはめると 下記になります。 (-1)^0 * 2^58 * 1.10 0001 0011 1011 0110 0010 1100 0101 1001 0111 0111 0000 0111 1110 1111b 符号部は素直に0 指数部は58 = (1081 - 1023) 仮数部は10 0001 0011 1011 0110 0010 1100 0101 1001 0111 0111 0000 0111 1110 1111b ここでちょっと見てください。 58[bits]では52[bits]を6[bits]超えています。 この場合、浮動小数点では影響の小さい(値の小さい)下位のビットを四捨五入します。 10 0001 0011 1011 0110 0010 1100 0101 1001 0111 0111 0000 0111 11(10 1111)b カッコ内が四捨五入対象(その中の最上位ビットが0or1) よって 仮数部は 10 0001 0011 1011 0110 0010 1100 0101 1001 0111 0111 0000 1000 00b となります。 これが誤差の原因です。 確かめ算をします。 [0,1081,1000010011101101100010110001011001011101110000100000b] は (-1)^0*2^(1081-1023)*(1.1000010011101101100010110001011001011101110000100000b) =2^58*(1.1000010011101101100010110001011001011101110000100000b) =2^6*2^52*(1.1000010011101101100010110001011001011101110000100000b) =2^6*11000010011101101100010110001011001011101110000100000b =11000010011101101100010110001011001011101110000100000000000b =437,893,890,380,859,392 IA-32アーキテクチャではサイズを大きくした、拡張倍精度浮動小数点などもありますが。 (x87 FPU命令ですが) 結局は破綻する箇所が先送りされるだけです。 拡張倍精度浮動小数点は、コンパイラ独自拡張や機械語でないと使用出来ません。 インラインアセンブラもOKですが。 Cのdoubleに持ってきた瞬間に誤差が出ます。 ※ 途中数値間違っていたらごめんなさい

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

有効桁数などで検索して下さい。 double 型でだいたい 15桁くらいまでしか表現できなかったはずです。 15^15 = 437893890380859375 かな?

関連するQ&A

  • 測量の誤差全般について

    標記の件について、ネットや参考書を読んでいるのですが、 恥ずかしながら今ひとつ理解できません。 すみませんが、御教示頂きたく宜しくお願い致します。 質問1 「確率誤差」とは50%の確率で生じる誤差の範囲とすると、「平均2乗誤差」も何%で生じる誤差の範囲とかで定義されるのでしょうか?(「平均2乗誤差」がイメージできなくて悩んでおります。)  また、「平均2乗誤差」が「ガウスの誤差曲線」にどう関係するか合わせて御教示お願いします。   質問2 「確率誤差」は、下式の様に「標準偏差」や「平均2乗誤差」を使ってを求める様ですが、 それぞれ違った値で導かれた結果をどう理解して使い分けたらようのでしょうか? ε=0.6745×標準偏差 ε=0.6745×平均2乗誤差

  • 誤差を用いた数値の丸め方

    化学成分分析を行った結果 30.0±2.6 wt% といった数値が出力される装置を使っています。 この場合、結果報告には「30」として記載するよう指導されたのですが、誤差と有効桁数の関係が良く分かりません。(この表記自体、間違いかもしれませんが) 誤差の桁数が測定値を丸める際に影響を及ぼす範囲について教えて下さい。 例えば上記の分析結果が 30.0±0.6 wt% や 30.0±0.06 wt% だった場合には、どういう風になるのでしょうか。 宜しくお願いします。

  • JAVAでMath.powを使用せずに、小数を小数で累乗したい

    javaでiアプリを作っているのですが、 iアプリの仕様のせいか、Mathクラスの累乗に関係する関数(pow,log,expなど)、 が使用できません。(使用しているDojaのバージョンは5.0) powの仕組みを使って、小数を小数で累乗するプログラムを作成したいのですが、 教えていただけないでしょうか?

  • 数値微分法についてです。

    数値的に微分を評価する時に、中心差分を使っているのですが、 どう考えても数値誤差としか思えない結果しかでません。 区切り幅は誤差が最も小さくなるように選んでいます。 中心差分よりも精度の良い数値微分法があれば教えていただけないでしょうか。 評価する関数は解析的に与えられておらず、補間して得られるようなものです。 (補間の精度にもよるのだと思いますが・・・)

  • 計算の丸め誤差の解消について

    プログラム上で計算するときに丸め誤差が発生し、困っています。 丸め誤差が発生している計算は -0.004+0.006+0.002 なのですが、 -0.004+0.006+0.002=0 となるところが、 =8.47E-09 となってしまっています。 オーダーの異なる計算ではないにもかかわらず、どうして誤差が発生するのかが理解できず困っています。 上の数値(左辺の方)の算出は、10^(-1)のオーダーの数値から計算されています。 多分、浮動小数点を使っているからだろうと考えているのですが、どのように解消したらよろしいでしょうか? 固定小数点を用いると、浮動小数点より誤差が少ないとありましたが、Cで固定小数点を用いる方法もわからないです。 よろしくお願いします。

  • C言語

    以下の流れにそってプログラムを書いてみましょう。 ある数値を渡されると、その数値の 2 乗を求め、その値を return する関数 func_pow を作る。 main 関数において、1 から 10 までの数値の 2 乗を func_pow 関数を呼び出して求め、それぞれの値とその合計を表示する。 この問題文がいまいち分かりません・・・。解き方を教えていただけたらうれしいです。

  • 最小二乗法における誤差の求め方

    こんばんは。 皆様よろしくお願いいたします。 あるデータにフィットさせる関数の係数を 最小二乗法を用いて、自分でプログラムを作って 見つけようと考えているのですが、 係数の誤差をどのように求めればいいかが わかりません。方法を探しても、直線の 場合はきれいに連立方程式が解けて、 誤差の伝播から計算するべき式が求まりますが、 一般の曲線の場合は解けないと思います。 gnuplotなどでフィッティングするとerrorが 出てきますが、あれはどのようにして 計算しているのでしょうか。 よろしくお願いいたします。

  • エクセルでの累乗で

    お世話になります。 エクセルの累乗で関数を使わず「11の18乗」をする場合に A1セルに「11」 A2セルに「=A1*11」 A3セルに 「=A2*11」・・・・とこの調子でコピーしていくと15乗の答えのあるA15セルからあとは正しい数値が表示されません。 これはどうしてですか? またどのようにすれば正しい数値になりますか?

  • セグメントのエラー

    現在、TurboCでプログラムを作っているのですが、前まで正常に動いていたプログラムに、簡単な計算式(pow関数など累乗の計算式)を加えたところ、コンパイル時に 「Error: Segment _TEXT exceeds 64k」 というエラーが出てしまいます。 環境はPC98の古いパソコンを使ってます。 なにかお心当たりのある方、どうかご教授の方よろしくお願いいたします。

  • C言語のプログラムについて質問です。

    C言語のプログラムについて質問です。 プログラムでどうしても2.2乗という少数のべき乗を使用しなければいけなくなったのですが、 POW関数では遅くて使い物になりません。 そこで、べき乗の高速化について調べたのですが、整数のべき乗の高速化しか出てきませんでした。 少数のべき乗の高速化アルゴリズムというものはあるのでしょうか?

専門家に質問してみよう