• ベストアンサー

floatの計算

c言語、32bit環境において float f = (float)99 / (float)10; のコードでfの期待値は9.9なのですが、実際は9.89999996となります。 99から9.9を導くにはどのようにコーディングすれば良いでしょうか?

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4855/10270)
回答No.1

floatやdouble等の2進浮動小数点数値は、2のべき乗の有効数値ビット数分の個数の和しか正確に表現できません。 つまり、0.5や、0.125などは正確に表せますが、0.1は2進では無限小数なので有限長のデータでは正確に表現できません。10進数で、1/3が正確に表現できないのと同じ。 10で割らずに、整数の範囲で計算して、表示するときに、下から1桁の左に小数点を表示するなど。

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

関連するQ&A

  • floatの有効桁数

    floatの有効桁数を調べていると(インターネット)、6桁や7桁というように、サイトによって異なっていました。 私はc言語でfloatが32bitの時を知りたいのですが、どのサイトが本当なのかなどが分かりませんでした。 なぜサイトによってさまざまな有効桁数を書いているのか? 結局floatの有効桁数は何桁なのか? が知りたいです。 よろしくお願いします。

  • float型での計算での質問

    下記コードについて、1から10までの値を0.1刻みで順に表示するプログラムですが、結果がこのようになりません。 表示結果 2.700000 までは0.1刻みなのですが、2.800000 と表示されるはずが 2.799999 となってしまいます。 コンパイラーは Borland C++ 5.5.1 for Win32 です。 なぜこのようになるのか教えてください。 int main(void) { float f; for(f=1; f<10.1; f=f + 0.1) printf("%f\n",f); return 0; }

  • floatで並べた2つのdivの高さを揃えるには?

    コーディング初心者です。 以下の内容のcssがかけなくて困っています。 内容は <p id="a">A</p> <div id="b">B</div> <p id="c">C</p> 今はこの3つをfloatで横並びにします。 #a {float: left;} #b {float: right;} #c {float: right;} ここで、BとCに入る内容が変わる場合でも2つの高さが揃うようにしたいのですが、 MTを使用し、Bを表示させないこともあるので、 BとCを<div>で囲み幅を指定することができません。 何か方法はありますでしょうか? 参考のURL等を教えていただけるだけでもたすかります。 よろしくお願いします。

    • 締切済み
    • CSS
  • VS2010でのint float数値について

    int MAX =10; for(int i=0; i<MAX-1; i++) {   float A;   A = i / ( MAX-1 );   float B;   B = i / ( MAX-1.0f );   // A or Bを使って処理 } A、Bの数値は変わるのでしょうか? この後のコードで、 Aの場合、望んだ結果が出なかったのですが Bの場合ですと期待通りの結果が出ました… VisualStudio2010 C/C++ Win7 64bitです。 よろしくお願いします。

  • 文字列をfloatで読み込む(atoi,sscanf)。しかし、値がおかしい。

    お世話になっています。 C言語の質問です。 文字列をfloatで読み込もうとしているのですが、出力結果がおかしくて困っています。 文字列をatofで変換した場合、doubleでは上手く表示できるのですが、floatでは少数が上手く表示できません。 また、sscanfでも試したのですが、上手く表示できませんでした。 どうしても、doubleを使わずにfloatであらわしたいと考えています。 どうかこのプログラムの問題点のご指摘お願いします。 実行結果 53.196600 53.196602 53.196602 ソース #include<stdio.h> #include<stdlib.h> #include<string.h> main() { char str[100]="53.1966"; double b; float c,d; b = atof(str); printf("%f\n",b); c = (float)atof(str); printf("%f\n",c); sscanf(str,"%f",&d); printf("%f\n",d); } 開発環境 windowsXP cygwin

  • C言語 極座標変換

    C言語で画像を極座標変換するソースコードをおしえていただけないでしょうか。512*512 32bitグレースケール(float)画像です。C初心者なので難しくて困っています。よろしくおねがいいたします。

  • doubleとfloatについて

    #include <stdio.h> int main() { float height,weight; printf("身長と体重を入力してください。\n"); scanf("%f",&height); scanf("%f",&weight); printf("身長は%fセンチ:体重は%fキロです。\n",height,weight); return 0; } 上記のようなプログラムを作って、身長には175.1体重には56.1という入力を行なって実行したところ、 身長は175.100006センチ:体重は56.099998キロです。 という結果が返ってきました。 heightとweightをdouble型で宣言したところ(もちろんscanf文の変換仕様は%lfにしています。)、結果は 身長は175.100000センチ:体重は56.100000キロです。 と私が、期待していたものが返ってきました。なぜfloat型だと期待通りの結果が返ってこないのでしょうか?ご教授お願い致します。

  • FLOATからlongに変換する時

    FLOATからlongに変換する時Visual Studio6(32Bitマシン)とVisual Studio8(64Bitマシン)で結果が異なるようですが、Visual Studio8でビルドする時Visual Studio6と同じ結果を得るようにできるでしょうか? Visual Studioの設定で可能なのか、ソースコードの記述で可能になるか教えてください。

  • doubleからfloatへの変換でのトラブル

    double test = 0.01; float test2 = (float)test; このプログラムを実行すると、test2には何故か「0.00999999998」という数字が入ってしまい、「0.01」にはなりません。正確にdoubleからfloatへキャストする方法はあるのでしょうか。 環境はWindows XP、Visual C++です。

  • 関数プロトタイプ無しで、引数が float の場合

    またまた float がらみでつまずています。 以下のようなソース(2つのファイルに分割されています)を実行すると、 f = 2.000000 と表示されました。 test1.c で、func() のプロトタイプを書いてないのが諸悪の根源だとは思うのですが(警告もでています)プロトタイプの役割は、 ・引数の型の不整合がないようにする ・必要に応じて、仮引数と実引数の型変換を発生させる だと思います。 このソースでは(たまたまですが)引数の型もあっているので、正常に実行できそうな気がするのですが、なぜ、結果がおかしくなってしまうのでしょうか。 確かに、プロトタイプがないのは好ましくはないですが。 test1.c に、int func(float f); を追加したときには、確かに f = 0.010000 と表示されます。 また、f と func() の引数を double にしたときには、プロトタイプがなくても、正常に実行されます。 ----- test1.c ------------- int main() { float f = 0.01; func(f); return 0; } ----- test2.c ------------- #include <stdio.h> int func(float f) { printf("f = %f", f); return 0; } ----- ここまで ------------