C言語でコンパイル実行すると、全ての変数が『+NAN』と表示される問題

このQ&Aのポイント
  • C言語でコンパイル実行すると、printfで表示する変数が全て『+NAN』と表示される問題が発生しています。
  • 質問のコードでは、入力された値に基づいて計算を行い、変数の値を更新していますが、何かしらのエラーが発生しているため、全ての変数が『+NAN』となってしまっています。
  • 具体的なエラーの原因や解決策については不明ですが、C言語の基本的なデータ型や演算子、制御構造などを再確認し、プログラムの修正が必要かもしれません。
回答を見る
  • ベストアンサー

+NANってなんですか??

以下のコードをコンパイル実行すると、printfで表示する変数が全て『+NAN』と表示されます。 ------------------------------- #include<stdio.h> int main(void){ double Vin,Vref,Vout,dv,P,I,PI,nextV,m; printf("input Vref : "); scanf("%f",&Vref); printf("\ninput Vin : "); scanf("%f",&Vin); printf("\ninput Vout : "); scanf("%f",&Vout); dv=0; P=0; I=0; m=0; nextV=0; printf("dv | P | I | PI | nextV | m | Vout |\n"); for(;;){ dv=Vref-Vout; printf("%f ",dv); P=dv*0.1; printf("%f ",P); I=I+dv*0.01; printf("%f ",I); PI=P + I; printf("%f ",PI); nextV = Vout + PI; printf("%f ",nextV); m=nextV/(Vin * 7.2); printf("%f ",m); Vout = nextV + 2; printf("%f \n",Vout); } return 0; } ------------------------- なにがなんだか、何がNANだかわかりません(涙 よろしくお願いします。

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

NaNってのは Not a Number で、数じゃない浮動小数点数データのこと。 第5章 浮動小数点 http://web.hc.keio.ac.jp/~fujimura/2002/lang/lec-n5.html の 5.2 あたりを参照してください。 で、計算式のからくりはよくわからんのだけど、 double Vin,Vref,Vout,dv,P,I,PI,nextV,m; printf("input Vref : "); scanf("%f",&Vref); printf("\ninput Vin : "); scanf("%f",&Vin); printf("\ninput Vout : "); scanf("%f",&Vout); ここの scanf の書式指定は %lf でないとダメです。 >gcc -Wall nan.c nan.c: In function `main': nan.c:7: warning: float format, double arg (arg 2) nan.c:9: warning: float format, double arg (arg 2) nan.c:11: warning: float format, double arg (arg 2) nan.c:36:2: warning: no newline at end of file ということで書式を修正して再度試してみてください。

wan-doggy
質問者

お礼

scanf() の書式が『%lf』だったのですね☆ 解決できました。 ありがとうございました。

関連するQ&A

  • C言語 質問です。

    以下のソースで半径、円周、面積を求めるものです。 #include <stdio.h> int main(void) { double radius; double pi = 3.1415926; double circumference; double area; printf("円の半径を入力してください。\n"); scanf("%f", &radius); circumference = radius * 2 * pi; area = radius * pi; printf("半径 = %f\n", radius); printf("円周 = %f\n", circumference); printf("面積 = %f\n", area); printf("\n\n"); return 0; } 半径(radius)をint型で、scanf("%d", radius); printf("半径 = %d\n", radius); では、うまく計算出来るのですが、double型ではだめなようです。 scanfを使用しなうで、 double radius = 10;とすると%fでも計算してくれるのですが、なぜでしょうか? C言語初心者です。よろしくお願いいたします。

  • c言語で行列の積の値を求める

    行列の成分を入力した後に、 入力された行列は X = 1 2 3 4 5 6 7 8 9 10 11 12 Y = 1 5 2 6 3 7 4 8 のように表示して、(上の数字は適当です。) 行列 X と行列 Y の積を求めて結果を表示するプログラムが作りたいのですが、上手く表示できなくて困っています。 #include <stdio.h> int main(void) { double A[10][10]; double B[10][10]; double C[10][10]; int i,j,m,n,p,k; printf("行列xの行数は?:"); scanf("%d",&m); printf("行列xの列数(行列yの行数)は?:"); scanf("%d",&n); printf("行列yの列数は?:"); scanf("%d",&p); printf("行列xを入力してください。\n"); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &A[i][j]); } } printf("行列yを入力してください。\n"); for (i = 0; i < n; i++) { for (j = 0; j < p; j++) { scanf("%d", &B[i][j]); } } この後にどうすればいいのか教えてください。 よろしくお願いします。

  • C言語のwhile文はネストできますか?

    「*」を使用して、n列、m行の四角を表示させるプログラムを考えました。 --------------------------------------------------------------------------------------------- #include<stdio.h> int main(void) { int i=0,j=0,n,m; printf("n入力:"); scanf("%d",&n); printf("\nm入力:"); scanf("%d",&m); printf("\n"); while(i<m){ while(j<n){ printf("*"); j++; } printf("\n"); i++; } return 0; } --------------------------------------------------------------------------------------------- しかし、1行分しか表示されません。 n=2、m=2の場合 ----------------- n入力: m入力: ** ----------------- としか表示されません。 whileのネストが悪いのでしょうか? それとも、初歩的なミスがあるのでしょうか?

  • C言語でmからnまでの合計を求めるプログラム

    これで動かないのですが、何が違っているのか、教えていただけますか。 #include <stdio.h> int main(void) { int m, n, sum, i, w ; printf("mからnまでの合計を求めます\n\n"); printf("m >> "); scanf(" %d", &m); printf("n >> "); scanf(" %d", &n); sum=0; if(m>n){ w=m; m=n; n=w; } sum=0; i=m; while(i<=n){ sum=sum+i; i=i+1; } printf("%d から %d の合計 = %d\n",m,n,sum); return 0; }

  • ポインタについて

    C言語を勉強しております。 ポインタについてどうしても分からない箇所があり、 質問させて頂きます。 例えば、以下の様なプログラムがあったとします。 #include <stdio.h> int hoge(int *); int main(){ int i; hoge(&i); printf("%d\n",i); exit(0); } int hoge(int *p_pi){ *p_pi = 10; } 上記のプログラムは標準出力に"10"と表示するだけのプログラムですが、 これを #include <stdio.h> int hoge(int *); int main(){ int *pi; hoge(pi); printf("%d\n",*pi); exit(0); } int hoge(int *p_pi){ *p_pi = 10; } と書くとhogeの「*p_pi = 10;」の箇所でセグメンテーションエラーが発生します。 &iで渡した時とpiで渡した時ではどの様な違いがあり、エラーが発生するのでしょうか。 私の認識では、 &iで渡す時はアドレスを渡し、 piで渡す時もアドレスを渡すため、同じ動作になると考えています。 どうかご教示ください。 情報に不足があれば、仰ってください。 よろしくお願いします。

  • C言語、円周率の値が0.000000?

    いつも大変お世話になりありがとうございます。 下記のコードを実行したところ、円周率の値が0.000000になりました。 どうしてでしょうか? アドバイスの程宜しくお願い申し上げます。 #include <stdio.h> int main(void) { double pi; printf("円周率の値はいくつですか?\n"); scanf("%1f", &pi); printf("円周率の値は%fです。\n", pi); return 0; } C:\MinGW>Sample9 円周率の値はいくつですか? 3.14 円周率の値は0.000000です。

  • ビルドが失敗してしまいます

    最近C言語を勉強を始めまして、参考書に載っていた以下のソースプログラムをvisualC++2010に打ち込んだのですがビルドが成功しません #include <stdio.h> #include <math.h> int main(void) { int d[33]; double m,v,s; int n=33; int i; double sum; printf("データを%d個入力してください\n",n); for(i=0;i<n;i++) { printf("date %d=",i+1); scanf_s("%d",&d[i]); } for(sum=0.0,i=0;i<n;i++) { sum+=d[i]; } m=sum/n; for(sum=0.0,i=0;i<n;i++) { sum+=(d[i]-m)*(d[i]-m); } v=sum/n; s=sqrt(v); printf("平均=%10.3f\n",m); printf("分数=%10.3f\n",v); printf("標準偏差=%10.3f\n",s); return 0; } エラーメッセージは ・'scanf' の宣言を確認してください。 ・(11): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません ・(14): warning C4566: ユニバーサル文字名 '\u00A5' によって表示されている文字は、現在のコード ページ (932) で表示できません ・(14): error C2065: 'i1' : 定義されていない識別子です。 と出るのですがさっぱりわかりません。どなたか教えてください。

  • n個からm個を取り出すプログラムでわかりません。

    #include<stdio.h> int main() { int n; int m; int i; int kumi; int san; printf("n:"); scanf("%d",&n); printf("m:"); scanf("%d",&m); for(kumi=1,i=n;i>n-m+1;i--){ kumi=kumi*i; } for(san=1,i=1;i<=m;i++){ san=san*i; } printf("%d個の中から%d個を取り出す組み合わせは%dとおり\n",n,m,kumi/san); return 0; } 組合わせの値がおかしいです。

  • C言語 プログラミング 行列演算

    下記のプログラムのおかしい点と解決法を教えてください。 コンパイルは通りますがうまく動きません。。 #include<stdio.h> #define MAX 500 int main(void){ int matrA[MAX][MAX],matrB[MAX][MAX],matrC[MAX][MAX],l,m,n,i,j,k; printf("lとmを入力してください:"); scanf("%d",&l); scanf("%d",&m); printf("行列Aを入力してください"); for(i=0;i<l;i++){ printf(">"); for(j=0;l<m;j++){ scanf("%d",&matrA[i][j]); } printf("\n"); } printf("nを入力してください(m = %d):",m); scanf("%d",&n); printf("行列Bを入力してください"); for(i=0;i<m;i++){ printf(">"); for(j=0;j<n;j++){ scanf("%d",&matrB[i][j]); } printf("\n"); } printf("C=\n"); for(i=0;i<l;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ matrC[i][j]+=matrA[i][k]*matrB[k][j]; } printf("%d",matrC[i][j]); } printf("\n"); } }

  • 組み合わせ

    n個の集合からp個を取る組み合わせの総数を出力するプログラムなんですが nCp=n!/p!(n-p)!という式を使い #include<stdio.h> int kaijo(int m); int comb(int n,int p); int main(void) { int i,j; printf("n="); scanf("%d",&i); printf("p="); scanf("%d",&j); printf("comb(%d,%d)=%d\n",i,j,comb(i,j)); } int kaijo(int m) { if(m>0) return(m*kaijo(m-1)); else return 1; } int comb(int n,int p) { if(n>0) return((n*kaijo(n-1))/(p*kaijo(p-1)*(n-p)*kaijo(n-p-1))); else return 1; } と書いてみたのですがこれではnが大きいとC言語のint型で扱える最大値を超えてしまい正しい結果が出力されません。  そこでint型を使ったままでnやpが大きい場合でもある程度出力できるようにしたいのですがどう改良したらよいのでしょうか? おそらくnCp=n*(n-1)*・・・*(n-p+1)/p!という式を使うのですがよく分かりません。よろしくお願いします。

専門家に質問してみよう