• ベストアンサー

C言語でdouble型の小数点の引き算をしたら1.15-1.1の結果が0.05のはずが0.04999・・822になります。0.05で使用したいのですが。

ffffffffの回答

  • ffffffff
  • ベストアンサー率35% (68/194)
回答No.4

 double は、浮動小数点型ですので、仕様上そうなります。  a を 1 として取り出したいのであれば、一旦、d*20 を 有効数字 小数点以下2桁の文字列にして、それを int で 読み込むのは、どうでしょうか。 int a; double b,d; char bb[20]; d = 1.15 - 1.1; b = d*20.0; sprintf(bb,"%.2lf",b); sscanf(bb,"%d",&a);

issaon55
質問者

補足

なるほど~。使えますね。 ですが、制御機器のため、スピードが要求されるので、 惜しくも、sprintfやsscanfが使えないのです。

関連するQ&A

  • C++でのdouble型データの精度

    こんにちは。 コンパイラは、Borland C++ Compiler 5.5 を使っています。 表題の「精度」とは、 正確な値が保証される、「整数部分の桁数」+「小数点以下の桁数」 の事です。 普通、double型データの「精度」は、16桁であると認識しています。 そのため、例えば、 a=123456789012345.6 という浮動小数点数は16桁なので、正しい値が保証されるはずです。 ところが、printf("%f", d1); のようにprintf関数で表示すると、 123456789012345.593800 と表示されました。 これは、d1が正しい値を保持できていないという事です そこで、桁数を下げていった所、 a=1234567890.1 つまり、精度は11桁しかないという事になります。 何か僕が勘違いしているのでしょうか? それとも、僕が使っているコンパイラの精度が11桁しかないという事なのでしょうか? 何かお分かりの方がいらっしゃれば、是非アドバイスを頂きたいと思います。 では、よろしくお願い致します。

  • c言語でint配列をdoubleに変換

    c言語でマイコンプログラムを作成しています. int型の配列をdoubleに変換するために以下のプログラムを記述し,テストしました. int a[4] = {0,0,1,8}; char s[4]; double d; char *temp; sprintf(s,"%d%d%d%d",a[0],a[1],a[2],a[3]); //文字列charをdoubleに変換 d = strtod(s,&temp); 望む結果は 18 ですが,なぜか上記結果は 1800 となりました. 試しに int a[4] = {1,2,3,4}; と,1234と表示されました. 上記より,出力値が左詰めのようになっています. 試しにVisual Studio 2013 C++で同様のプログラムを実行すると,所望の結果を得ることが出来ました. プログラムがおかしいのでしょうか?それともマイコンのコンパイラのバグでしょうか? お分かりになられる方がいらっしゃいましたら,ご教授宜しくお願い致します.

  • C言語について

    C言語初心者です。 今、プログラミングをしていてわからない箇所があるので質問させていただきます。 自作の関数へ配列を送る際、多重配列の途中の配列の値を関数に送りたい場合どのようにすれば よいのでしょうか? 文ではわかりづらいと思うので、例を書きます。↓ /* 関数 */ int sum(int data[],int N){ int i,temp=0; for(i=0;i<N;i++){ temp=temp+data[i]; } return(temp); } /* 本文 */ int output; int a[10][20][30]={適当な数字が入ってるとします。} // この時、配列の左と右に値を指定して、真ん中の配列を関数に送りたいです。 output=sum(???,20); //ちなみに現在はもう一つ1次元配列を作り、そこに一旦コピーしてから関数に送っています。 //なにか良い方法があればご教授ください。

  • C言語のprintfで桁数をそろえる

    次ので桁数をそろえると書いてあったけどやってみたらできなかった。 コンパイラはMS visual c++バージョンはおそらく7.1.3019 #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { int a; scanf("%d",&a); printf("a=%3d\n",a); return 0; }

  • 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言語で、数値の桁数を求めるには??

    C言語で数値の桁数を求めるプログラムをもとめたいのですが どうすればいいのでしょうか int c; int a; c=12345; a=printf("%d",c); とするとaに桁数は入るのですが cがPRINTF関数により表示されてしまいます どうすればいいでしょうか? わかる方はおしえてください、おねがいします。

  • double型で収まりきれない小数の値を求めたい。

    下記のようなプログラムを作っています。 int num = 1000; double d1 = 12345.6; double d2 = 0.0: for(int i=0;i<num;i++){   d2 += Math.pow(d1,(double)i); } d2の値を求めたいのですが、これをこのまま実行すると、得られる数値が大きすぎてd2の値がInfinityになってしまいます。 小数を格納できる最大の型はdouble型ですよね? それに収まりきらないということは、私の求めたい数値はJavaでは求めることが出来ないのでしょうか? それとも何かInfinityになってしまうのを回避する手段はあるのでしょうか? d2で得られた値はそのまま他の計算式で利用するのでどうしてもすべて小数値でなくてはならないのです。 どなたかお知恵をお貸しください。 よろしくお願いします!!

    • ベストアンサー
    • Java
  • C言語から質問です。

    C言語から質問です。 /* main関数の中で初期化した配列 data[10]={60,30,70,25,20,9,92,55,20,10}; を関数 keisan() に引数として渡して、関数keisan()内で 平均値、最大値,最小値 を求め、その結果をmain関数に戻し、main関数内で 平均値、最大値,最小値を表示させるプログラムを作成せよ。 int keisan(const int data[], int data_kosuu, double answer[]) { return 0; } とする。 (注) プロトタイプ宣言を用いよ。 ヒント:平均値,最大値,最小値の3つの値を main関数に戻すやり方として、配列answer[]を使うとよい。 data_kosuu は、配列の要素数を与えるものです。 ヒント: (int型の変数)/(int型の変数)=int型の値です。 int型同士の割り算の答えANSWERをdoubleにしたい場合は、  ANSWER=(double)(int型の変数)/(int型の変数);    と(double) キャストという操作をする必要がある */ #include <stdio.h> int keisan(const int data[], int data_kosuu, double answer[]); int main(void) { int i; int a[10]={60,30,70,25,20,9,92,55,20,10}; // この値を使ってください double ans[3]; keisan(a,10); /* keisan関数に配列と配列要素数を引数で与える */ for(i=0; i<10 ; i++) printf("a[%d]=%d\n",i,a[i]); printf("平均=%lf 最小値=%d 最大値=%d\n",ans[0],ans[1],ans[2]); return 0; } /* 合計・最大値・最小値を求める関数 */ int keisan(const int data[], int data_kosuu, double answer[]) { int i; int sum; int min,max; min=10; /* min の初期化 */ max=10; /* max の初期化 */ sum=0; /* 合計値の初期化 */ for (i=0; i<10 ; i++){ sum = sum+data[i]; if(data[i] > max) max=data[i]; if(data[i] < min) min=data[i]; } sum=sum/10; answer[0]=sum; answer[1]=min; answer[2]=max; } エラー error C2198: 'keisan' : 呼び出しに対する引数が少なすぎます。 とでて先に進めません。 教科書などを見ても間違いがわかりません; 虫食いになってるところを自分なりにやってみたため、 根本的に間違ってるかもしれませんが、 どうかアドバイスや指摘などをお願いします。

  • C言語:double型での戻り値は小数点以下何桁ですか?

    Cでプログラミングの勉強をしています。 double型で宣言した変数をprintfで出力するとき、代入した数値は小数点以下1桁なのに、なぜか出力結果では6桁になると問題集に書かれていました。解説はありません。 プログラムは下のものですが、なぜかお分かりになる方、教えていただけませんか? #include<stdio.h> struct test{ int x; double y; } void print(struct test a); void set_value(struct test a); void main(void){ struct test a ={1, 2.0}; set_value(a); print(a); } void print(struct test a){ printf("a.x = &d, a.y= %f\n", a.x, a.y); } void set_value(struct test a){ a.x =10; a.y =20.0; }

  • 小数点の引き算が不正確

    みなさまこんばんわです。よろしくお願い申し上げます。 VB.NET 2008でFunctionプロシージャを作っています。 その内容は、Double型の値を与えると、その小数点第一位のみをInteger型で返すというものです。 たとえば、3.142を与えると、1を返します。38.98を与えると、9を返します。 これを次のようにコーディングしました。コメントは、39.9を与えたときの動作です。答えは、9を期待しますよね。 ------------------------------------- Function SyosutenWoKaesu(ByVal NyuuryokuSuuchi As Double) As Integer Dim SyosutenBubun As Double Dim SeisuuBu As Integer SeisuuBu = Fix(NyuuryokuSuuchi) 'Fix関数は、入力数値の整数部を返すので、39をInteger型で返します SyosutenBubun = NyuuryokuSuuchi - CDbl(SeisuuBu) 'データ型をDouble型に変換し、引き算。39.9-39なので、0.9という答えを期待しますが、実際は、0.899999999999999が返ってきます SyosutenBubun = SyosutenBubun * 10 SyosutenWoKaesu = Fix(SyosutenBubun) '10倍した数の整数部なので、8を返します。困ります。 End Function ------------------------------------- なんで 39.9 - 39 が0.9じゃないんでしょうか? しかも、10.9など、少ない数字だと、きちんと演算されます。また、100.9などだと、途中、0.900000000000006などの数値になるんですけど、答えはきちんと9を出力します。 また、小数点第一位が9以外だと、うまくいくんです。 ちなみに、CDbl関数を使わなくても同じでした。また、-演算子の代わりに、Mod演算子(割り算の余りを返す演算子)を使っても全く同じでした。 なんでこんな不正確な演算結果になるんでしょうか? あるいは、別のもっとスマートな方法がありますでしょうか? よろしくお願い申し上げます。