• ベストアンサー

C言語キャスト

こんにちは Windows7+Cygwinで次のコードの挙動がおかしいです。バグでしょうか void main() { double a = 33.33; int b; a *= 10; a *= 10; b = (int)a; printf("%d\n", b); } 結果:3333と表示するはずが3332になる 詳しい方いましたらよろしくお願いします。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

最後に printf("%20.15f\n", a); を追加したらどんな表示が得られますか?

yotudesu
質問者

お礼

3332.999999999999545 内部データが小さいことが判明しました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

あなたが言う「バグ」というのが「この入力に対してこう出力するようにコーディングしなくてはならない、のにそうなっていない」という意味ならばバグです。しかし、「このコードについて出力結果がこうあるべきなのにそうなっていない、これは gcc のバグだ」という意味ならばバグではないです。 説明するとこの欄では足りないので、参考 URL をご覧ください。このページでは .NET 系での話をしていますが、本質的な事情は gcc でも同じです。

参考URL:
http://dobon.net/vb/dotnet/beginner/floatingpointerror.html
yotudesu
質問者

お礼

リンクありがとうございます! バグではなくて内部データが小さいことが原因だったんですね!

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語について

    C言語で、二つの整数値を読み込んで、前者の値が後者の何%であるかを実数で表示するプログラムを作成しようとして以下のコードを書きました。 #include <stdio.h> int main(void) { int n1, n2 ; puts("二つの整数を入力してください。") ; printf("整数A : \n") ; scanf("%d" , &n1) ; printf("整数B : \n") ; scanf("%d" , &n2) ; printf("Aの値はBの%f%%です。\n" , (double)(n1 / n2) * 100) ; return 0 ; } 上記コードを実行すると、0.000000%のような結果になります。 そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 なぜ、上記コードだと上手くいかないんでしょうか?

  • C言語なんですがうまくうごきません。

    X=1においてX^nをm回微分した値を求めるプログラムを作っているのですが、 何度も考えて訂正したりしてるのですが、どこが悪いのかわかりません 再帰関数を使ってます。 デバッグして調べてみてるのですが、うまくいってるようにみえるのですが、最後の値が0になります。 nを大きい値にすると、マイナスになったりするんです。 よくわかりません。 ちなみにnとmは正で、mは10までの数を入力します。 このプログラムの基本形を変えないで問題改善することはできるのでしょうか? わかる人いましたら教えてください。 #include <stdio.h> double differentiate(double n, int m); int main(void) { int a, b; printf("Input 2 number\n"); fflush(stdout); scanf("%d %d", &a, &b); printf( "a = %d\nb = %d\n", a, b ); printf("Answer = %d\n", differentiate(a, b)); return 0; } } double differentiate(double n, int m) { if(m == 1){ return n; }else{ return n * n-1 * differentiate(n-1, m-1); } }

  • C言語 %表示

    二つの整数値を読み込んで、前者が後者の何%かを表示するプログラムを作成したいです。 #include<stdio.h> int main(void){ int no1,no2; printf("整数を入力してください。\n"); printf("整数A:"); scanf("%d",&no1); printf("整数B:"); scanf("%d",&no2); printf("Aの値はBの値の%f%%です。\n",(double)(no1/no2)); } Aの値はBの値の0.0000%です。となってしまいます。 上記のプログラムの訂正をお願いします。

  • C言語の質問です。

    #include"stdio.h" int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = a+b; printf("add=%d\n", add); return 0; } と、------------------------------------------------------------------------------ #include"stdio.h" int tasizan(int x, int y); int main(void){ int a, b, add; scanf_s("%d%d", &a, &b); add = tasizan(a, b); printf("add=%d\n", add); return 0; } int tasizan(int x, int y){ int aa; aa = x + y; return aa; } の違いを教えてください。

  • c言語の実行結果どうか教えてくださいませ

    double fA(double a) { printf("kansu fA\n'); returna/2.0 } double fB(double b) { double a; printf("kansu fB\n"); a=fA(b); printf("fA(b)=%f\n",a); return a; } int main(void) { fB(210.0); return 0; } 特に小数の表示でございます… 他のサイトでも聞いたのですモヤモヤしまして 何卒宜しくお願いします。

  • c languageで 簡単な質問があります

    下のcodeで 1u 2Uはなんですか? void main(void) { int a = -1; if(a < 1u) printf("True"); else printf("False"); } //結果 False void main(void) { if(3 < -2U) printf("Large : %d\n", -2U); else printf("Large : %d\n", 3); } //結果 Large : -2

  • C言語

    このプログラムを作りたいのですが… ??????????? 物の総数を入れてください:12 取り出す物の数を入れてください:2 12個の異なる物から2個をを取り出す組み合わせの数は66です ?????????????? ここに出てくる数字は scanfで入れます。 だいたい こんな感じだと思うのですが… ***********の部分が わかりません。 ??????????????? #include<stdio.h> int factorial(int m,int r) { ************** } int main(void) {int a,b; printf("物の総数を入れてください:") scanf("%d",&a); printf("取り出す物の数を入れてください:") scanf("%d",&b); printf("12個の異なる物から2個を取り出す組み合わせの数は%dです。\n",a,b,factorial(a,b));) ?????????????? お願いします(>_<)

  • C言語の初歩的な質問

    質問1----------------------------------------- #include<stdio.h> int main() {  int a;  char b[10];  for(int i = 0;i < 2;i++){   scanf("%d",&a);   printf("整数%d\n",a);  }  scanf("%s",b);  printf("文字列%s\n",b); } /* この際に、例えばabと入力すると結果が 整数-858993460 整数-858993460 文字列ab となり整数入力を無視して進められるのはなぜでしょうか? */ 質問2----------------------------------------- #include<stdio.h> void func(int**); int main() {  int *p;  func(&p);  printf("%d",*p); } void func(int **pp) {  int n = 10;  *pp = &n; } /* func関数のnはスコープからはずれて変数の寿命がなくなるはずなのにprintfで表示されるのはなぜでしょうか? */ ---------------------------------------------- C言語は一冊の本とネットの入門サイトをかじった程度の理解です。

  • C言語

    main() { int a = 5,b=2,e,f,g=3,i; double c,d,h=2.0; c = a/b; printf("c = %f\n",c); d = a/h; printf("d=%f\n",d); e = a++; f = ++b; g+= 4; i= ++a + b; printf(" a = %d\n",a); printf(" b = %d\n"b); printf(" e = %d\n"e); printf(" f = %d\n"f); printf(" g = %d\n"g); printf(" i = %d\n" i); 答え a=7,b=3,c=2.0,d=2.5,e=5,f=3,g=7,i=10 この問題のa,b,iがどうやってこの値になるのかがわかりません解説お願いします。

  • 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){ } よろしくお願いします。

このQ&Aのポイント
  • 食洗機の排水ホースを固定しておく吸盤をかけたら、吸盤が変形して使い物にならなくなってしまった。箸などを入れるかごにきゅっと押し込んで洗った結果だ。
  • 食洗機の吸盤を直す方法はあるのか?吸盤が変形して使い物にならなくなってしまった場合、どのように復元することができるのか疑問だ。
  • 食洗機の吸盤が変形してしまった時、どのように修理することができるのか気になる。箸などを入れるかごにきゅっと押し込んで洗った結果、吸盤が使い物にならなくなってしまった。
回答を見る