• ベストアンサー

実行結果を倍精度浮動小数点数(double)で表示させたいです

C言語の勉強をしている大学生です。 プログラミングをしている中で、質問が3つほど出てきました。 互いに関連しているのでまとめて質問させてください。 無限等比級数を計算するプログラムを作成しました。 これをコンパイルして実行すると、double型で定義しているのに 小数点以下7桁となってしまいます。 doubleは15桁ということなので、15桁で出力したいのです。 これが1つめの質問です。 <実行結果> input n:10 1.500000 1.750000 1.875000 1.937500 1.968750 1.984375 1.992188 1.996094 1.998047 pow関数がmath.hに含まれているのかも定かではなく、 インターネットでmath.hというものがあると書いてあったので、 インクルードしてみましたが、これは適切でしょうか? これが2つめの質問です。 最後になりますが、インターネットで多倍長ライブラリというものが あるということを知りましたが、この使用方法がわかれば具体的な例を 挙げながら教えていただきたいと思います。 ------------------------------------------------------------ #include <stdio.h> #include <math.h> int main(void) { int n; int i; double total; printf("input n:"); scanf("%d",&n); if (n<1){ printf("unable\n"); return 0; } for(i=1; i<n; i++){ total += 1.0 / pow(2.0,i); printf("%f\n",total+1.0); } } ------------------------------------------------------------

noname#17299
noname#17299

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

  • ベストアンサー
  • secretd
  • ベストアンサー率39% (50/126)
回答No.1

はじめ2つだけ. 1)printf関数は桁数等を制御する記法が存在します. %fの部分をたとえば%1.15fとかくと,精度が15桁となります. 2)計算結果を見れば.合っていることがわかるのでは?

参考URL:
http://wisdom.sakura.ne.jp/programming/c/c57.html
noname#17299
質問者

補足

お返事ありがとうございます。 フォーマット指定子というものがあったとは。 僕の持っている初心者向けの本には載ってませんでした。 解決しました。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

1. > printf("%f\n",total+1.0); の部分を < printf("%.15f\n",total+1.0); とすれば良いでしょう。 2. 標準的な環境ではpow関数はmath.hで宣言されています。 3. 多倍長ライブラリはそのライブラリのマニュアルを参照しましょう。 標準仕様はないので、少なくとも具体的なライブラリの指定がなければ使い方を説明することは不可能です。

noname#17299
質問者

お礼

解決しました。ありがとうございます。 他にも二項分布などのちょっとしたプログラムを作っていて、 数学の勉強のためにもっと精度の高い結果が欲しいと思っていましたが、 15を30にしたら桁数が増えたので、多倍長ライブラリを使わなくても十分でした。 余力があれば、多倍長ライブラリも使ってみます。

関連するQ&A

  • 浮動小数点数が表示されないんです…。。。

    研究でC言語を使わないといけないんですが、簡単な小数点の表示すらうまくできないんです。誰か助けてください。プログラムの内容はinput.gridというファイルから各変数の値をfscanf関数で読み込み、画面に表示するというごく単純なものでコンパイル、リンクはうまくいくのですが、実行のときにfloating point not loadedと画面に表示され途中で処理が終わってしまいます。同じような経験されたかたいらっしゃいますか?なんとかならないでしょうか??下にプログラムと入力データを記述しておきます。 ・プログラム #include<stdio.h> #include<stdlib.h> main() { int *type; int *t; int *n; double *x; double *y; double *z; double *u; double *v; double *w; double *p; double *rho; FILE *fp_grid,*fp_press ; /*ファイルポインター*/ if((fp_grid=fopen("input.grid","r"))==0){ printf("file not open \n"); exit(1);} if((fp_press=fopen("input.press","w"))==0){ printf("file not open \n"); exit(1);} fscanf(fp_grid,"%d",&t); fscanf(fp_grid,"%d",&n); fscanf(fp_grid,"%f %f %f %f %f %f %f %f",&type,&x,&y,&z,&u,&v,&w,&p,&rho); printf("check\nt=%d,n=%d\n",t,n); printf("%d %f %f %f %f %f %f %f %f",type,x,y,z,u,v,w,p,rho); fclose(fp_grid); return; } 入力データinput.grid 0 21170 0 0.700000 -0.100000 -0.070000 0.000000 0.000000 -0.019927 0.000000 1000.000000

  • プログラムの作成

    Cで、キ-ボ-ドから整数を1個(mとする)、実数を1個(xとする)それぞれ入力し、 S=Σ(n=0からmまで)1/2n+1×(x-1/x+1)^2n+1 の値を求めるプログラムを作ってみたのですが、あってるかどうかわかりますか? #include<stdio.h> #include<math.h> main() { double y=0; int i,m,x; printf(\" Input m: \") scanf(\"%lf\", &m); printf(\" Input x: \") scanf(\"%lf\", &x); for(i=0; i <= m; i++) { y += 1/(2*i+1)*pow((x-1)/(x+1),2*i+1) } printf(\" S = %d\n\", y) }

  • C言語による浮動小数点表示

    #include<stdio.h> #include<math.h> main() { float a=1.5*pow(2,-15); unsigned char *e; e=(unsigned char *)&a; printf("a=%02x,%02x,%02x,%02x\n",*(e+3),*(e+2),*(e+1),*(e+0)); } というプログラムで a=38,40,00,00 という結果がでたのですが これは何を表しているのでしょうか? よろしくおねがいします

  • うまく出力されない

    #include <stdio.h> #include <math.h> int main(void) { int j=0; double t,i[500]; for(t=0;t<=20*pow(10,-3);t=t+(0.04*pow(10,-3)) ){ i[j]=(3.9*pow(10,-12)*5*pow(10,3)*(sin(314*(t+(0.04*pow(10,-3))))-sin(314*t)))/(0.04*pow(10,-3)); printf("%3d %1.10f\n",j,i[j]); j++; } } これを出力させたところ、202番以降からしか表示されませんでした。 これはなぜなのでしょうか? 分かる方がいたら、ぜひ、解決法を教えてもらえませんか? 宜しくお願いします。

  • doubleからfloatにすると表示が変になる

    しょうもない質問ですいません。 下記のC言語の行列積のコードでは行列の変数をdoubleとしていますが、これをfloatに全て置き換えると、printfで表示させる結果がバグってしまいます。 原因は何でしょうか? 最近ひさしぶりにC言語を触ったので、しょうもないところでつまずきました。 お願いします。 ----------------------------------------- #include <stdio.h> #include <stdlib.h> #define N 10 //N次の正方行列まで扱えるようにする void matrixmultiply(int n,double a[N][N],double b[N][N],double c[N][N]); int main(int argc, char** argv) { int i,j,n; double A[N][N],B[N][N],C[N][N]; FILE *readin1,*readin2; /*行列の値が書き込まれたファイルを開く*/ if((readin1=fopen("a.dat","r"))==NULL) { printf("a.datを開けません\n"); exit(1); } if((readin2=fopen("b.dat","r"))==NULL) { printf("b.datを開けません\n"); exit(1); } printf("行列の次数を入力してください\n"); scanf("%d",&n); printf("%d次の正方行列の掛け算を行います\n\n",n); /*ファイルから数値を読み込み、配列に代入する*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { fscanf(readin1,"%lf",&A[i][j]); fscanf(readin2,"%lf",&B[i][j]); } } matrixmultiply(n,A,B,C); //関数を呼び出し行列の掛け算を行う。 /*結果を表示する*/ printf("計算結果\n"); for(i=0;i<n;i++) { for(j=0;j<n;j++) { printf("%lf ",C[i][j]); } printf("\n"); } fclose(readin1); fclose(readin2); return 0; } /*掛け算を行う行列2つと、結果を入れる行列を引数として受け取る。*/ void matrixmultiply(int n,double a[N][N],double b[N][N],double c[N][N]) { int i,j,k; /*受け取った2つの行列の掛け算を行う。*/ for(i=0;i<n;i++) { for(j=0;j<n;j++) { for(k=0;k<n;k++) { c[i][j]+=a[i][k]*b[k][j]; } } } }

  • 割り算ができない

    Cを用いてプログラムを製作しています。 そこでバグが発生し、突き詰めていくと割り算が出来ていないことが原因であることが わかりました。 どのように修正すればよいのでしょうか、ご教授お願いいたします。 #include <stdio.h> #include <math.h> #include <stdlib.h> int i; double ENGx,dENG; main(){ dENG=0.01; for( i = 0; i<= 100000; i++){   ENGx = (double)i * dENG;   printf("%e\n",2.0/sqrt(ENGx));   ←2.0/にしなければ大丈夫なのですが。。                           powを用いずに解決できないでしょうか?      }   return(0); }

  • pow

    「1~10までの数、 その2乗、 その3乗」を10行出力するものです。 なぜか5^2 = 24 なってしまいました。なぜですか。お願いします。 #include <stdio.h> #include <math.h> int main(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 3; j++) { printf("%4d ", (int)pow(i+1, j+1)); } printf("\n"); } return 0; }

  • 最速化するにはどうしたらいいでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double abssucc(double x){ return x / (1 - pow(2,-53)); } double abspred(double x){ return x * (1 - pow(2,-53)); } double succ (double x){ if(abs(x) < pow(2,-1022)) return x + pow(2,-1074); if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow(2,-1022)) return x - pow(2,-1074); if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムをpow関数使わないでもっと速く動かしたいのですが、やり方がわかりません。 教えて下さい!お願いします。

  • エラー:浮動小数点の不正な使用

    /*月ごとの平均気温・降水量を構造体の配列に格納した後、 */ /*年間平均気温、年間平均降水量を求めるプログラムを作成せよ。*/ #include<stdio.h> void main(void) { int i; double total_kion, total_suiryo, av_kion, av_suiryo; struct YEAR_DATA{ double kion[12]; double suiryo[12]; }; struct YEAR_DATA data[12] = {{3.6, 50},{4.3, 61},{7.5, 98},{13.5, 153},{18.0, 162},{21.7, 210}, {25.6, 218},{26.8, 170},{22.8, 209},{16.9, 121},{11.4, 74},{6.2, 48}}; for(i=0 ; i<12 ; i++){ total_kion += data[i].kion; total_suiryo += data[i].suiryo; } av_kion = total_kion / 12; av_suiryo = total_suiryo /12; printf("年間平均気温 %lf\n", av_kion); printf("年間平均降水量 %lf\n", av_suiryo); } 構造体のところを勉強しています。 上の問題を解いてみたのですが、for文の中の2行に「浮動小数点の不正な使用」というエラーが起こってしまい、答も違っています。 どこが間違っているのか、ご指摘お願いします。

  • どこがおかしいのでしょうか?

    #include <stdio.h> #include <math.h> #include <time.h> double pow_2_53 ; double pow_2_1022 ; double pow_2_1074 ; double abssucc(double x){ return x / (1 - pow_2_53); } double abspred(double x){ return x * (1 - pow_2_53); } double succ (double x){ if(abs(x) < pow_2_1022) return x + pow_2_1074; if (x >= 0) return abssucc(x); else return abspred(x); } double pred(double x){ if(abs(x) < pow_2_1022) return x - pow_2_1074; if (x >= 0) return abspred(x); else return abssucc(x); } int main(){ pow_2_53 = pow(2,-53); pow_2_1022 = pow(2,-1022); pow_2_1074 = pow(2,-1074); clock_t start, end; double r= 0; int i=0; start = clock(); for(i;i<1000000;i++){ r= succ(1); printf("%.50f\n",r); }end = clock(); printf("ループ100万回の時間: %f秒\n", (double)(end - start) / CLOCKS_PER_SEC); } このプログラムを動かしたいのですが、動きません。どこがおかしいのでしょうか? 教えて下さい!

専門家に質問してみよう