• ベストアンサー

単精度計算と倍精度計算

F(x)=(1-x・x)1/2乗において、xの値を0.9、0.99、…0.99999と変化させた場合の単精度計算と倍精度計算の結果を求めるプログラムを教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • NewMoon
  • ベストアンサー率100% (1/1)
回答No.1

#include <stdio.h> #include <math.h> int main(){   double dx;   float fx;   double tempd = 1.0f;   float tempf = 1.0f;   for(int i = 0;i < 5;i++){     tempd *= 0.1f;     printf("x = %-5.5f\n",1.0f-tempd);     dx = 1.0f - tempd;     printf("double = %-15.15f\n",sqrt(1.0f-dx*dx));     tempf *= 0.1f;     fx = 1.0f - tempf;     printf("float = %-15.15f\n\n",sqrt(1.0f-fx*fx));   }   return 0; } こういうこと?

その他の回答 (1)

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

作成依頼目的のような気もしますが... 単精度、倍精度というのは、IEC 60559の単精度浮動小数点数と倍精度浮動小数点数のことでしょうか? その場合、使用している処理系の浮動小数点型は、それらの形式に対応しているのでしょうか?(そうでなければ、ソフト的にエミュレートする必要が生じます) C言語の場合、sqrtを使うと、その部分以降はdoubleになってしまいます。sqrtfは任意実装のため、処理系がサポートしているかどうかわかりません。C++では、(規格上は)sqrtがfloat用にも多重定義されているべきですが、実際にはそうなっていない処理系がほとんどです。この辺りはどうなっているのでしょうか? Cでは、float型の値を(いったんdoubleに変換せずに)直接出力させる手段を(標準の範囲では)持っていませんが、自作することを要求しているのでしょうか?

関連するQ&A

  • FFTの単精度と倍精度の計算時間

    FFTのプログラミングで計算時間を短縮するため、三角関数の計算にチェビシェフの三項漸化式を用いたところ、計算時間はかなり短縮されました。ただ精度が心配なので、組み込み関数の三角関数の倍精度結果と、漸化式の単精度および倍精度の結果を比較したところ、2000点を越えるあたりから単精度ではかなりの誤差が生じましたが、倍精度では問題ありませんでした。そこで質問ですが、単精度と倍精度の違いとして、「精度とメモリが倍」は分かるのですが、計算時間はどうなるのでしょうか。 参考:チェビシェフの三項漸化式 cos{(j+1)*h} = 2*cos(h) * cos(j*h) - cos{(j-1)*h} sin {(j+1)*h} = 2*cos(h) * sin(j*h) - sin{(j-1)*h}

  • 単精度 倍精度

    単精度 倍精度という言葉をたまに聴きます。 camに使うときや、「体積計算などするときには倍精度でないと計算が出来ない」とか「単精度から倍精度に変換したから数値がおかしい」などと聞くことがあるのですが、そもそも「単精度 倍精度」どう意味なのか、具体的にどういう数値なのかご存知の方がいらっしゃったら教えてください。

  • 計算精度(限りなくゼロに近く)

    現在、fortranで大きな数値計算をしています。 そこで、計算回数が多く、その計算過程において大きい値と小さい値とを何回も計算していると誤差が次第に大きくなっていきます。 A=BとなるようにA(又はB)を求めるときの判別としてabs(A-B)<10**(x) としています。 このxに-300ぐらいの値をいれ判別したいのですがそれは可能ですか? もちろん計算には倍精度を使っていますがabs(A-B)が10**(-17)付近になると値が一定になってしまいます。これがfortranの限界なのでしょうか?

  • ある正の数から6をひいて二乗する計算を間違えて、2倍してから6をひいた

    ある正の数から6をひいて二乗する計算を間違えて、2倍してから6をひいたので、結果が57小さくなった。この正の数から6をひいて二乗した値を求めよ。 この問題の答えと解説お願いします!!

  • MATLABの計算精度

    いま,  A=[0.803, -0.803, 1.2124, 0.803, -0.803, -0.803, 1.2124, 0.803]; とします. このとき,次の2通りの演算をします. (i) a=0; for I=1:8  if( A(I)>=0 )   a=a+A(I)*0.25;  else   a=a+A(I)*0.75;  end end (ii) Bi=[0.25, 0.75, 0.25, 0.25, 0.75, 0.75, 0.25, 0.25]; b=sum(Bi.*A); (i)と(ii)によって得られる和の値をMATLABのコマンド上で表示すると, 同じ値として表示されるのですが,a-b と計算すると,0 ではなく, 8.04e-15のようになります.(現環境ではMATLABが使えないので,確認できませんが,もっと大きいデータでやったとき場合には,上記のように誤差が生じました). 困っているのは,現在組んでいるプログラムでは計算した値の正負によって 異なった計算をする必要があり,計算精度が非常に重要になってきます. そのため計算結果が例えば +1.4e-15となるか -6.4e-16 となるかによってその後の計算結果が大きく変わってしまいます. MATLABでは,上記(i)(ii)のような誤差が生じるためか,+1.4e-15となってほしいところが,なぜか -6.4e-16となってしまいうまくプログラムが動きません. MATLABでは,for文によって和をとるのではなく,一回でまとめて計算しなければ誤差が生じるのでしょうか? また,MATLABで計算精度を変更できないのでしょうか? (formatコマンドによって,「format short g」「format double g」としましたが有効な小数点が増減するだけで結果は同じでした.) よりよい精度で計算するにはどうしたらよいのでしょうか? 回答よろしくお願いします.

  • Fortranの倍精度実数について

    こんにちは。 現在、Fortran 90でプログラムを作成しています。 その中で、整数の倍精度実数への型変換についての疑問がわきましたので、質問させていただきます。 以下の2つのプログラムで、計算がより速く、より精度よくできるのはAとBどちらなのでしょうか。 実際は下記のプログラムが、ループの中に入っているので少しでも計算時間を短くしたいのです。 よろしくお願いいたします。 program A(毎回dxを足す) ----------------------------- real(8) :: pi, dx real(8), dimension(1000) :: x integer i, j pi=atan(1d0)*4d0 dx=pi/5000d0 x=0d0 j=1 do i=1, 1000 x(i)=x(j)+dx j=i write(*,*)x(i) end do ----------------------------- program B(毎回dx*ループ回数を計算する) ----------------------------- real(8) :: pi, dx real(8), dimension(1000) :: x integer i, j pi=atan(1d0)*4d0 dx=pi/5000d0 x=0d0 do i=1, 1000 x(i)=dx*dble(i) write(*,*)x(i) end do -----------------------------

  • C言語での桁落ち

    C言語での桁落ちの以下のプログラムを教えてください f(x)=xの5乗-ルート(1+xの10乗)+1/2×ルート(1+xの10乗) x=0,1,2・・・50 における f(x) の値を求めよ. そのまま計算した場合と式を変形して正確に計算した場合を比較せよ(一つのプログラムで両方計算). のプログラムを教えてください。

  • 差分法の精度(電位の計算)

    よろしくお願いします。 現在、差分法により電位を求めています。 ポアソン方程式を差分化してプログラムにより電位を求め、それと電位の式の計算結果をと比較しているのですが、差分法の計算結果があまり近い値となりません。 差分法の精度とはどのくらいなのでしょうか? 電荷がない場合では完璧に一致するのですが、電荷があると一致しません。ポアソン方程式の一般的な解はまだ導き出されておらず、電荷も常に一定ではないので十分な精度はない、みたいなことをちらっと聞いたこともあるので、もしやと思ったのですが、そもそも差分法の電位の計算とは一致しないものなのでしょうか? よろしくお願いします。

  • 統計ソフトRで4倍精度の計算はどうするのでしょうか?

    初心者ですが、ご教示お願いします。 Fortran などのような4倍精度の計算はRではどうするのでしょうか? 宜しくお願い致します。

  • C言語での桁落ちの以下のプログラムを教えてください

    C言語の本の問題で答えが書いてなく困っております。 f(x)=xの5乗-ルート(1+xの10乗)+1/{2×ルート(1+xの10乗)}の式が与えられ x=0,1,2・・・50 における f(x) の値を求める場合のプログラムを教えてください。 注**そのまま計算した場合と式を変形して正確に計算した場合を比較せよ(一つのプログラムで両方計算).

専門家に質問してみよう