質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • C

    4659questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4526questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Linux

    4521questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Cで行列のランク計算のプログラムを作っています。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 1,908

inxsirencer

score 10

前提・実現したいこと

Cで行列のランク計算をするプログラムを作っています。

プログラムの流れは、
1.行列の行数(lnum)、列数(cnum)を入力
2.行列の各成分を入力、格納。
3.行列の走査(matsearch)を行う。
走査範囲は初めは1列目の全行であるとする。
1列目から順に
特定の列の走査範囲内の要素をを上から順に確認
→すべて0 ⇒ 走査範囲はそのままで次の列に

→上端が非0かつ上端以外はすべて0 ⇒ 走査範囲を一つ縮める(元の走査範囲から上端の行を抜いたもの)。そして走査範囲は次の列へ

→上端以外に非0が存在
⇒ その列が基本変形対象範囲最重要列J₀
かつ
その走査範囲の上端の行は基本変形対象範囲開始行I₀。
for行ループ → break
for列ループ → break
matsearch  → 終了

最終的に…matsearchの返却値は
①J=cnumですべてその列の成分が0
→ -2
②(I₀,J₀)=0かつbreak
→ I₀
③(I₀,J₀)≠0かつbreak
→ -1
4.行基本変形
①:
rank計算へ

②:
(I,  J₀)成分のうち、I₀≦I≦lnumの範囲で
非0となっている成分について考える。
このような成分のうち、最小行番号をもつ成分の行番号
をI₁とする。(I₀<I₁≦lnum)

2-2-1.1:(I₁,J)成分でI₁行成分をすべて割る。
2-2-1.2:(I₀,J)成分に
「(I₀,J)成分 + (I₁,J)成分」
の演算結果を代入する。
2-2-1.3:
(I,J)成分に(I>I₀)
「(I,J)成分 -{(I,J)成分*(I₀,J)}」
の演算結果を代入する。
そのまま③へ

③:
操作2-1
2-1.1:(I₀ , J₀)成分でI₀行成分をすべて割る。
2-1.2:(I,J)成分に(I>I₀)
「(I,J)成分 -{(I,J)成分*(I₀,J)}」
の演算結果を代入する。

という手順を踏んで行基本変形を行う予定だったのですが、この手順通りに操作がいかないです。

どうかよろしくおねがいいいたします。

発生している問題・エラーメッセージ

計算過程でループが終了せずどこが間違っているのかがわからないです。

該当のソースコード

#include <stdio.h>
#define NA 7
#define NB 3
#define PLUS 0
#define MINUS 1
#define ERROR_R 1.000000e-15


int zerojudgef(double a)
{
  return ((a < ERROR_R) & (a > (-1)*ERROR_R) ? 0 : 1);
}

int matsearchf(double mat[][NA][NA], int lnum, int cnum, int keylinenum, int keycolumnnum, int rank)
/*
keylinenum : the number of line that is the start point of elementary row operation. Exactly, in the column of key-column number, and below the line of the start line of elemntary row operation ,there may exists the element that is not zero which has the smallest number of line. The line number of such elements is defined as keylinenum.
That is, if the start line of elementary row operation is not the exactly defined keyline number, the start line of elementray row operation is linebreak.

keycolumnnum : the number of column that is the key-column of elementary row op
ertion.
*/
{
  int i, j;
  int  linebreak = 0;
  for(j=0; j<cnum; j++){
  int k = 0;
  int notzero = 0;
  int keynum_for_count = 0;
  for(i=linebreak; i<lnum; i++){

      if(zerojudgef(mat[0][i][j])){
    notzero++;
      }/*for-for-if*/
    }/*for-for*/
/*Finding out the key-line number
In the column of key-column number, and below the line of key-line number, there may exists the element that is not zero which has the smallest number of line. The line number of such elements is defined as keylinenum, and in this function, for the purpose of counting the key-line number, a variable 'keynum_for_count' is defined. 
*/
    do{
      keynum_for_count = (zerojudgef(mat[0][k][j]) != 0 ? k : -1);//ここは最悪k+linebreakでもok
    k++;
    }while( (keynum_for_count < 0) & (k != (NA-1) ) );//matのイランとこは全部0で初期化が条件

    if(zerojudgef(notzero)){/*There exist at least one element that is not equal to zero.*/

      if(zerojudgef(mat[0][linebreak][j])){/*The top elements in the scope of line-searching is not equal to zero.*/
    if(notzero > 1){/*There exists not-zero elemnet at the top of the scope of line searching, and exists not-zero elements below the elements at the top. break roop*/
      keylinenum = keynum_for_count;
      keycolumnnum = j;
      return -1;
      break;
    }else{
/*There exists not-zero element only at the top of the searching range, and elements below it is all equal to zero. continue roop*/
      linebreak++;

    }/*for-if-if-if*/
      }else{/*The top elements in the scope of line-searching is equal to zero, but there exist at least one elements that is not equal to zero. break roop*/
      keylinenum = keynum_for_count;
      keycolumnnum = j;
      return linebreak; 
      break;
      }/*for-if-if*/
    }else{/*There exist only elements that is equal to zero. continue roop*/

    }/*for-if*/
  }/*for*/

  rank = linebreak;
  return -2;

  /*Finally, the result is classified into 3 types.
1:All the elemnets in the last column of the scope is equal to zero.
output = -2
2:The (keylinenum, keycolumnnum) elemnet is equal to zero.
output = linebreak
3:The (keylinenum, keycolumnnum) elemnet is not equal to zero.  
output = -1
*/
}

void divf(int divdo, int divdonel, int cnum, double mat[][NA][NA])
{
  /*
    divdo :割る数の要素の列番号
    divdonel :割られる数の要素が存在する行番号
    cnum :割り算実行される行の列数
   */
  double divisor = mat[0][divdonel][divdo];

  int i;
  for(i=0; i<cnum; i++){
  mat[0][divdonel][i] /= divisor;
  }

    /**/
  int line, column;
  puts("divf"); 
     printf("\n");
      for(line=0; line<NA; line++){
    printf("|");
    for(column=0; column<NA; column++){
      printf("%5.2f", mat[0][line][column]);
        }
    printf(" |\n");
      }
      printf("\n\n");


  /**/

}

void subtraf(int p, int q, int r, int cnum, double mat[][NA][NA], double coeff)
{
  /*
   This function operates the line p ± the line q.
    Judge by whether r = 0 or 1  
    -r=0→addition+
    -r=1→subtractionー
    cnum = The total number of line
    coeff = the coefficient of the number that subtacts any numbers
  */
  int pm = (r == 1 ? (-1) : 1);
  int i;
  for(i=0; i<cnum; i++){
    mat[0][p][i] += (coeff * pm * mat[0][q][i]);
  }

  /**/
  int line, column;
  puts("subtraf"); 
     printf("\n");
      for(line=0; line<NA; line++){
    printf("|");
    for(column=0; column<NA; column++){
      printf("%5.2f", mat[0][line][column]);
        }
    printf(" |\n");
      }
      printf("\n\n");


  /**/


}

void erowoperatef(double mat[][NA][NA], int lnum, int cnum, int keylinenum, int keycolumnnum)
{
  int rank = 0;
  int i, j, k;
  int breakjudge = 0;
  for(i=0; i<NA; i++){
    k = ( ( matsearchf(mat, lnum, cnum, keylinenum, keycolumnnum, rank) < 0 ) ? matsearchf(mat, lnum, cnum, keylinenum, keycolumnnum, rank) : 1 );
    switch(k){
    case 1:{
      divf(keycolumnnum, keylinenum, cnum, mat);
      subtraf( matsearchf(mat, lnum, cnum, keylinenum, keycolumnnum, rank), keylinenum, PLUS, cnum, mat, 1);
    }/*for-switch-case0*/
    case -1:{
      divf(keycolumnnum, keylinenum, cnum, mat);
    if(i = keylinenum){
    }else{
      for(j=0; j<lnum; j++){
        subtraf( j, keylinenum, MINUS, cnum, mat , mat[0][j][keycolumnnum]);
      }/*for-switch-case-1-if-for*/
    }/*for-switch-case-1-if*/
      break;
    }/*for-switch-case1*/
    case -2:{
      breakjudge = 1;
      break;
    }/*for-switch-case-1*/
    }/*switch*/
      if(breakjudge == 1){
    break;
    }/*for-if*/
  }/*for*/

}

int rankcaloperatef(double mat[][NA][NA], int lnum, int cnum)
{
  int keylinenum = 0;
  int keycolumnnum = 0;
  erowoperatef(mat, lnum, cnum, keylinenum, keycolumnnum);
  int rank = 0;
  int empty  = matsearchf(mat, lnum, cnum, keylinenum, keycolumnnum, rank);
  return rank;
}

int main(void)
{
  double mat[NB][NA][NA] = {};
  int lnum, cnum;
  /*mat[kind of matrix][line number][column number] */
  puts("\nWe will calculate the rank of a matrix.\nPlease enter the scale of matrix.");
  printf("The number of lines (under %d) = ", NA);
  scanf("%d", &lnum);
  printf("The number of columns (under %d) = ", NA);
  scanf("%d", &cnum);
  puts("Please enter the elements of the matrix.");
  puts("'mat[i][j]' represents the (i,j) elements of the matrix.");
  int i, j;
  for(i=0; i<lnum; i++){
    for(j=0; j<cnum; j++){
      printf("mat[%d][%d] = ", i+1, j+1);
      scanf("%lf", &mat[0][i][j]);
      mat[1][i][j] = mat[0][i][j];
    }
  }
  /*mat[1]にはもともと行列が保存される。*/
  int Rank = rankcaloperatef(mat, lnum, cnum);
  int r;
  for(r=0; r<2; r++){
    printf("\n");
    for(i=0; i<lnum; i++){
      printf("|");
      for(j=0; j<cnum; j++){
    printf("%5.f", mat[r][i][j]);
      }
      printf(" |\n");
    }
    printf("\n\n");
  }
  printf("\nThe rank of this matrix is %d.\n", Rank);
  return 0;

}

試したこと

上のソースコードのなかで、2つの/**/で挟まれたprintf …の部分は演算過程を見るために付け加えたものです。いくつかのデバッグは自己解決できたのですが、これに関してはわからないです。

又、初めのアルゴリズムでは欠陥があったので、少し変えて作り直しました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ozwk

    2017/02/10 15:36

    「3.i行j列の成分が0ならば、n[i]=0,非0ならばn[i]=1を格納。これをj列の成分すべてについて行う。」これを文面通りに受け取ると、最終列の結果がn[]に格納されていることになるんですが、おそらくそういうことじゃないと思います。

    キャンセル

  • ozwk

    2017/02/10 15:38 編集

    例えば「100. j=0..Nについて手順101~103を繰り返す」みたいに正確に書いてもらえますか?

    キャンセル

回答 2

check解決した方法

+1

問題点

*matsearchf内

erowoperatefやrankcaloperatefでmatsearchfを使用する時に渡す仮引数にkeylinenum,keycolumnnum,rankがあった。matsearchfでこれらの仮引数に数値を代入して、それをmatsearchf外のブロック有効範囲でも利用する予定だった。しかし、ポインタ型変数に指定なったために、これらの仮引数に代入した数値はmatsearchfのプロック有効範囲しかもたず、matsearchf外では当然のことながらこれらの変数が元の関数内で保持していた値に戻ってしまう。その為、正しくない値で以降の計算を行ってしまっていた。

→これらの3変数をポインタ型変数として扱うことにより解決。

*erowoperatef内

 case -1:{ 
  divf(keycolumnnum, keylinenum, cnum, mat); 
  if(i = keylinenum){ 
  }else{
   for(j=0; j<lnum; j++){
    subtraf( j, keylinenum, MINUS, cnum, mat , mat[0][j][keycolumnnum]); 
   }/*for-switch-case-1-if-for*/
  }/*for-switch-case-1-if*/ 
  break;
 }/*for-switch-case1*/


の部分で「行ー行」を行う際に「I₀行ーI₀行」を行わないようにとif文で「引かれる側の行」の行番号を判断できるようにしていた。しかし、

-for文で行番号として使用している変数がjであるのに対し、変数iをif文での判定で用いていて無意味なことを行っていた。

→書き換え。

-if文の判定式で等価演算子==を用いていた筈であったが、=が1つだけで代入操作を行っていた。

→書き換え。

-for文とif文の前後の位置関係を間違えていた。
本来は

 for(j=0; j<lnum; j++){
  if(j ==  keylinenum){
   …
  }
 }

とすべきだった。

→書き替え。

完成版のソースコード

#include <stdio.h>
#define NA 7
#define NB 3
#define PLUS 0
#define MINUS 1
#define ERROR_R 1.000000e-15


int zerojudgef(double a)
{
  return ((a < ERROR_R) & (a > (-1)*ERROR_R) ? 0 : 1);
}

void divf(int divdo, int divdonel, int cnum, double mat[][NA][NA])
{
  /*
    divdo :割る数の要素の列番号
    divdonel :割られる数の要素が存在する行番号
    cnum :割り算実行される行の列数
   */
  double divisor = mat[0][divdonel][divdo];

  int i;
  for(i=0; i<cnum; i++){
  mat[0][divdonel][i] /= divisor;
  }


}

void subtraf(int p, int q, int r, int cnum, double mat[][NA][NA], double coeff)
{
  /*
   This function operates the line p ± the line q.
    Judge by whether r = 0 or 1  
    -r=0→addition+
    -r=1→subtractionー
    cnum = The total number of line
    coeff = the coefficient of the number that subtacts any numbers
  */
  int pm = (r == 1 ? (-1) : 1);
  int i;
  for(i=0; i<cnum; i++){
    mat[0][p][i] += (coeff * pm * mat[0][q][i]);
  }



}


int matsearchf(double mat[][NA][NA], int lnum, int cnum, int * keylinenum, int * keycolumnnum, int * rank)
/*
keylinenum : the number of line that is the start point of elementary row operation. Exactly, in the column of key-column number, and below the line of the start line of elemntary row operation ,there may exists the element that is not zero which has the smallest number of line. The line number of such elements is defined as keylinenum.
That is, if the start line of elementary row operation is not the exactly defined keyline number, the start line of elementray row operation is linebreak.

keycolumnnum : the number of column that is the key-column of elementary row op
ertion.
*/
{
  int i, j;
  int  linebreak = 0;
  for(j=0; j<cnum; j++){
  int k = 0;
  int notzero = 0;
  int keynum_for_count = 0;
  for(i=linebreak; i<lnum; i++){

      if(zerojudgef(mat[0][i][j])){
    notzero++;
      }/*for-for-if*/
    }/*for-for*/
/*Finding out the key-line number
In the column of key-column number, and below the line of key-line number, there may exists the element that is not zero which has the smallest number of line. The line number of such elements is defined as keylinenum, and in this function, for the purpose of counting the key-line number, a variable 'keynum_for_count' is defined. 
*/
    do{
      keynum_for_count = (zerojudgef(mat[0][k+linebreak][j]) != 0 ? (k+linebreak) : -1);//ここは最悪k+linebreakでもok
/*
If 'zerojudgef(mat[0][k][j])' is equal to zero, 'keynum_for_count' (= -1) must not be substituted into variable 'keylinenum'. This is because serching range will continue to be same as before.

If 'zerojudgef(mat[0][k][j])' is not equal to zero, 'keynum_for_count' must be substituted into variable 'keylinenum'.
*/      
    k++;
    }while( (keynum_for_count < 0) & ((k+linebreak) != (NA-1) ) );//matのイランとこは全部0で初期化が条件
    if(zerojudgef(notzero)){
/*There exist at least one element that is not equal to zero.*/

      if(zerojudgef(mat[0][linebreak][j])){
    /*The top elements in the scope of line-searching is not equal to zero.*/
    if(notzero > 1){
      /*There exists not-zero elemnet at the top of the scope of line searching, and exists not-zero elements below the elements at the top. break roop*/
      *keylinenum = keynum_for_count;
      *keycolumnnum = j;
      *rank = linebreak;
      return -1;
      break;
    }else{
/*There exists not-zero element only at the top of the searching range, and elements below it is all equal to zero. continue roop*/

      linebreak++;
      *keylinenum = keynum_for_count;
      *keycolumnnum = j;
          *rank = linebreak;


    }/*for-if-if-if*/
      }else{
    /*The top elements in the scope of line-searching is equal to zero, but there exist at least one elements that is not equal to zero. break roop*/
      *keylinenum = keynum_for_count;
      *keycolumnnum = j;
      *rank = linebreak;      
      return linebreak; 
      break;
      }/*for-if-if*/

    }else{
/*There exist only elements that is equal to zero. continue roop*/
    }/*for-if*/
  }/*for*/
  *rank = linebreak;
  return -2;

  /*
Finally, the result is classified into 3 types.
1:All the elemnets in the last column of the scope is equal to zero.
output = -2
for example, 
|_    1_    0_    0__|
|_    0_    1_    0__|
|_    0_    0_    0__|

2:The (keylinenum, keycolumnnum) elemnet is equal to zero.
output = linebreak
3:The (keylinenum, keycolumnnum) elemnet is not equal to zero.  
output = -1
*/
}

void erowoperatef(double mat[][NA][NA], int lnum, int cnum)
{
  int keylinenum = 0;
  int keycolumnnum = 0;
  int rank = 0;
  int i, j, k;
  int breakjudge = 0;
  for(i=0; i<NA; i++){
    k = ( ( matsearchf(mat, lnum, cnum, &keylinenum, &keycolumnnum, &rank) < 0 ) ? matsearchf(mat, lnum, cnum, &keylinenum, &keycolumnnum, &rank) : 1 );
    switch(k){
    case 1:{
      divf(keycolumnnum, keylinenum, cnum, mat);
      subtraf( matsearchf(mat, lnum, cnum, &keylinenum, &keycolumnnum, &rank), keylinenum, PLUS, cnum, mat, 1);

    }/*for-switch-case0*/
    case -1:{     

      divf(keycolumnnum, keylinenum, cnum, mat);
      for(j=0; j<lnum; j++){
    if(j == keylinenum){
    }else{
        subtraf( j, keylinenum, MINUS, cnum, mat , mat[0][j][keycolumnnum]);
      }/*for-switch-case-1-for-if*/
          }/*for-switch-case-1-for*/

      break;
    }/*for-switch-case1*/
    case -2:{
      /*Go to calcuration of rank.*/

      /*Finding out the element that has the smallest column number in lowest line that has the not-zero element */
      int topdivcol = 0;
      do{
    if(zerojudgef(mat[0][(rank-1)][topdivcol])){
      break; 
    }else{
      topdivcol++;
    }
      }while(topdivcol < cnum);

      /*Operating the elementary row operation to the lowest line that has not-zero elements, and topdivcolumn.*/
      if(topdivcol == cnum){
      }else{

    divf(topdivcol, (rank-1), cnum, mat);
      for(j=0; j<lnum; j++){
        if(j == (rank-1)){
        }else{
          subtraf( j, (rank-1), MINUS, cnum, mat , mat[0][j][(rank-1)]);
      }/*for-switch-case-2-if-for-if*/
          }/*for-switch-case-2-if-for*/

      }

      breakjudge = 1;
      break;
    }/*for-switch-case-1*/
    }/*switch*/
      if(breakjudge == 1){


    break;
    }/*for-if*/
  }/*for*/

}






int rankcaloperatef(double mat[][NA][NA], int lnum, int cnum)
{
  int keylinenum = 0;
  int keycolumnnum = 0;
  erowoperatef(mat, lnum, cnum);
  int Rank = 0;
  int empty = matsearchf(mat, lnum, cnum, &keylinenum, &keycolumnnum, &Rank);
  return Rank;
}


void matprintf(double mat[][NA][NA], int matnumber, int lnum, int cnum)
{

int i, j;

if(matnumber == 1){printf("Original Matrix\n");
}else{
printf("Operated Matrix\n");
}


for(i=0; i<lnum; i++){
    printf("|_");
    for(j=0; j<cnum; j++){
      printf("%5.2f_", mat[matnumber][i][j]);
    }
    printf("_|\n\n");
  }

}


int main(void)
{

  static  double mat[NB][NA][NA] = {};
  int lnum, cnum;
  /*mat[kind of matrix][line number][column number] */
  puts("\nWe will calculate the rank of a matrix.\nPlease enter the scale of matrix.");
  printf("The number of lines (under %d) = ", NA);
  scanf("%d", &lnum);
  printf("The number of columns (under %d) = ", NA);
  scanf("%d", &cnum);
  puts("Please enter the elements of the matrix.");
  puts("'mat[i][j]' represents the (i,j) elements of the matrix.");
  int i, j;
  for(i=0; i<lnum; i++){ 
    for(j=0; j<cnum; j++){
      printf("mat[%d][%d] = ", i+1, j+1);
      scanf("%lf", &mat[0][i][j]);
      mat[1][i][j] = mat[0][i][j];
    }
  }
  /*Original matrix is input into mat[1].*/

  int Rank = rankcaloperatef(mat, lnum, cnum);
  matprintf(mat, 1, lnum, cnum);
  matprintf(mat, 0, lnum, cnum);
  printf("\nThe rank of this matrix is %d.\n", Rank);
  return 0;
}

趣味でCを勉強し始めたばかりの初心者でございます故、初歩的なミスがかなり多かったです。
お付き合いいただきありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

計算誤差により "i行j列の成分が0ならば" の判定が狂うことはありませんか?
一般に float/doubleなどの整数型でないものを ==, != で判定してはならないのですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 20:03

    回答ありがとうございます。
    ご指摘の通り、浮動小数点型を==で判定していました。
    そのため、浮動小数点型を判定できるように修正を行いました。
    しかし、根本的には解決できなかったため、もう一度書き直しましたが上手くいっておりません。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4659questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • C++

    4526questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Linux

    4521questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。