• ベストアンサー

1.4なのに

C言語で int Ans; Ans = 180 * 1.4; と計算すると251になるんですけど。 なんでですか? 1.4のところにカーソルを合わせると 1.4=1.399999999999と表示されるのですけど なんでですか? 対策方法ご存知の方教えてください。

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

  • ベストアンサー
回答No.1

プログラムには誤差が生じます. それが原因です. 1度検索エンジンで「丸め」と記述して検索をかけてみてください. いろいろのっています. わたしは,自分でプログラム(小数第3位を丸め込んだり,四捨五入したり…)を組んでいます.

その他の回答 (2)

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.3

int Ans; int a = 180; double b = 1.4; Ans = (int)((double)a * b); 実際にはこのようにキャストされています。 対策方法というか、何故そうなるのかを理解したほうが良いと思います。 「キャスト」「浮動小数点」「IEEE754」 あたりのキーワードを調べてみてください。 double→intの場合、小数部が切り捨てられる為 251.999999999999999 が 251になります。

回答No.2

C言語の int型はどの範囲までの情報を確保できるか調べてみましょう。

関連するQ&A

  • 関数について

    C言語の勉強をしているのですが、関数のところがよく理解できません。 ------------------------------ #include <stdio.h> int beki(int a, int b); int main(void) { int n; n=beki(2,3); printf("%d\n",n); printf("%d\n",beki(3,4)); } int beki(int a, int b) { int i,ans; ans=1; for(i=1; i<=b; i++) { ans=ans*a; } return ans; } ---------------------------- 実行結果 8 81 ----------------------------- 上のサンプルで int i,ans; ans=1; for(i=1; i<=b; i++) { ans=ans*a; } の部分は、解説書には「渡されたデータa,bを使って戻り値ansを計算 している」「aのb乗を計算している」などとありましたが、なぜaのb乗を計算しているのでしょうか?実行結果が8と81の何に関係しているのでしょう? ansやa,bの値を求めたら、何の値になるのでしょうか? これらについて、解説をお願いいたします。

  • UNIX & Linux の標準出力で得たデータを、C言語のローカル変数に取り込むには?

    c言語の関数を実行中に、UNIXにあるシェルコマンド"wc"の標準出力から得られるデータを、直接ローカル変数に入れたいと思います。 int hoge(void) { int ans; ans = system("wc"); return } こんな感じにしたかったのですが、systemコマンドでは、戻り値を期待できずに居ます。 何か善い方法はありませんか?

  • c言語

    length個のint型の要素を持つ配列A[], B[], C[]を受け取り、 A,Bの各々の各要素毎にその和(A+B)を計算して、その答えをCに代入して終了する関数 void add(int a[], int b[], int c[], int length)を定義しなさい。(以下のソースコードの空白を埋めなさい) #include<stdio.h> void diff(int A[], int B[], int C[], int length); int main(){ int a[3]={1,2,3}; int b[3]={4,5,6}; int ans[3]; diff(a, b, ans, 3); printf("answer = %d %d %d \n", ans[0], ans[1], ans[2]); } void add(int A[], int B[], int C[], int length){ } よろしくお願いします。

  • 私はC言語を習い始めて5日の初心者です。

    私はC言語を習い始めて5日の初心者です。 下記のプログラムが動かないので優しく教えてください。 どうかお願いします。 #include <stdio.h> int main() { int ans1,ans; int total printf("コンビニ行くときは(1:車で 2:自転車で 3:歩いて)行く\n"); scanf("%d",&ans1); printf("1:汗かいた記憶がない 2:たまに汗かく 3:よく汗をかく\n"); scanf("%d",&ans2); total=ans1+ans2; if (total<4) { printf("運動不足です\n"); }else { printf("良く運動していますね\n"); } return(0); }

  • 配列の疑問。

    もうすぐC言語のテストがあるので適当に自分で問題を作って プログラムを作る練習をしていたのですが配列の所でちょっと疑問に思いました。 問題 ひとつずつ数字を入力していき、それまでの数字の合計と平均を求めるプログラム。 0を入力するとプログラム終了(配列、ポインタ、関数を用いること) #include <stdio.h>    int wa(int *a,int b); main() {    int a[10],ans,i=0,c;    double ave=0,j;    while(1)    {      scanf("%d",&a[i]);      c=a[i];      i++;      if(c==0){         exit(1);      }      ans=wa(&a[0],i);      printf("合計%d\n",ans);      j=i;      ans=wa(&a[0],i);      ave=ans/j;      printf("平均%lf\n",ave);      printf("計算回数%d回\n",i);    } } int wa(int *a,int b) {    int ans=0,i;    for(i=0;i<b;i++){      ans+=*(a+i);    }    return ans; } このようなプログラムで一応自分の期待通りには動いてくれたのですが、 こういう「0」を入力しない限り終わらないプログラムのときに配列を利用すると どれぐらい領域を取っておくかがわからないんですよ。 今回はa[10]としてますが、結局10しか確保してないから10回しか入力できないかな? っと思って実行してみますが普通に10回以上でもエラーがでることもなく実行できるんですよね。 これはなぜでしょうか? 私の配列の考え方がまちがっているのでしょうか?

  • ポインタによる関数への配列渡し

    林晴比古さんの「新C言語入門」でC言語を勉強している初心者です。 現在ポインタの勉強をしています。色々教科書の文例等をポインタで書くとどうなるか試しております。 上書P200練習問題2に「配列の最大値を返す(その際配列の長さを渡す)」プログラムがあり、それをポインタで渡すプログラムに直してみました。 仮引数に「maxdata」を設定し、そのアドレスを関数側に渡し、関数側ではポインタとして受け取る(そうすれば関数側からはreturnで値を返す必要がない)、と考え、下記のように書いてみました。 #include <stdio.h> void max_of_array(int n[], int len, int *ans); int main(void) { int dt[6] = {50,20,80,30,10,40}; int maxdata; max_of_array(dt,6,&maxdata); printf("最大値=%d\n", maxdata); return 0; } void max_of_array(int n[], int len, int *ans) { int i; ans = &n[0]; for (i=1; i<len; i++){ if (*ans < n[i]) *ans = n[i]; } } しかしコンパイルすると、何故か「最大値=1」となってしまいます。(正しくは80です) 他にも色々試してみましたがうまくいかず、かなり考えてみたのですがどうしても分かりません。お分かりの方、どうすれば正しくなるのが教えてください、よろしくお願いします。

  • 3進数を10進数に変換

    3進数や5進数のように2の階乗ではない任意の進数の文字列を、C言語のビットシフトを使って10進数に変換するプログラムについて、質問させていただきます。 ビットシフトを使わないで、任意の進数の文字列を10進数に変換する方法は分かっていますが、ビットシフトを使った方が非常に計算が高速で出来るので、ビットシフトを使いたいと思っています。 下記のプログラムは4進文字列を10進整数に変換するものです。2進、8進文字列の場合は、シフトするビット数を1ビット、3ビット(つまり、ans <<= 1、ans <<= 3)にすれば計算することが可能です。しかし、3進数や5進数の場合、いろいろと考えたのですが、どのようにすれば良いのか分かりません。 下記のプログラムのようにビットシフトを使って3進数や5進数の文字列を10進数に変換するには、どのように工夫すれば良いでしょうか? どなたかご教授をお願いいたします。 #define STRING_NUM 2 /* 文字列の長さ */ int main(void) { int i; int ans = 0; /* 10進数の整数 */ char buf[STRING_NUM]; /* 4進数の文字列 */ buf[0] = '3'; buf[1] = '1'; for ( i = 0 ; i < STRING_NUM; i++ ){ printf(" %c", buf[i]); } printf("\n"); for ( i = 0 ; i < STRING_NUM; i++ ){ if ( buf[i] == '0' ){ ans <<= 2; /* シフトするビット数 */ ans |= 0; } if ( buf[i] == '1' ){ ans <<= 2; ans |= 1; } if ( buf[i] == '2' ){ ans <<= 2; ans |= 2; } if ( buf[i] == '3' ){ ans <<= 2; ans |= 3; } } printf( "ans = %d\n", ans ); return 0; }

  • C言語の&に関する質問

    C言語で if (x == 0.0) (いろいろな計算) return x < 0.0 && (n & 1) ? -ans : ans; というプログラムがあるのですが、 最後のreturnのところで x がゼロ以下で且つ、n &1の場合には -ansを返し、そうでない場合にはansを返すとあるのですが、 n&1というのはどういう意味なのでしょうか? C言語で&と言えば、 http://www9.plala.or.jp/sgwr-t/c/sec14.html のページにあるように、ビットごとの AND演算子ですが、 この場合にはどういう意味で使われているのでしょうか?

  • int型の割算

    ご存知の方教えていただけますか? 以下のコードで実行するとansが0.5ではなく0になってしまうのですが なぜでしょうか? int a = 64; // a=1,b=2でも0になってしまいます。 int b = 128; float ans; ans = a/b; printf("ans = %f",ans) 仕様ですか? 大変申し訳ありません。よろしくお願いします。

  • 電卓処理

    初めて、書き込みます。よろしくお願いします。 C言語で、電卓を作成しようとしています。 計算処理は 足し算、引き算、掛け算はint型で行い、 割り算だけは、小数点を使いたいのでfloat型を使いたい と考えています。 また、計算結果の表示は、char型の文字列として表示する。 としたとき、問題として、 float型をchar型に変換する方法がわかりません。 どなたか教えていただけないでしょうか。