• ベストアンサー

froat型

int型の変数iとjに100000000を代入し、float型の変数rを宣言し、   r = (i + j + 1); を計算するとrは200000000.000000になりdouble型の変数uを宣言し、   u = (i + j + 1); を計算するとuは200000001.000000になりました。 何故そうなるのかわかりません。教えてください。

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

  • ベストアンサー
  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.2

floatは仮数部が24ビットなので有効桁は7桁強です。 ですから、8桁より大きな隔たりのある数の加減算の場合、桁落ちが発生して、200000000には1を何度足しても200000000のままということです。 有効桁に気を遣うのは浮動小数点演算の基本なので、常に意識するようにしてください。

その他の回答 (1)

  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

参考URLのFloat型の説明にあるようにFloatの扱える数値の上限を超えてしまったからではないかと思いますが。 Floatが扱える数値の大きさを超えてしまったために舌の部分がカットされたのでしょう。

参考URL:
http://www.kyoto-su.ac.jp/~yamada/programming/float.html#float

関連するQ&A

  • 自作関数のでの変数宣言について

    #include <stdio.h> int i,j; int cale(int i,int j) //cale関数の内容;iとjの宣言も同時実施!!! { int r;      r=i+j; return r; } 3行目でcale関数の定義をしています。2行目では変数i,jの初期宣言をしていますが、本によると2行目は必要なくコンパイルしても問題がありませんでした。ボーランドですけど。 教えて欲しいのは2行目の変数宣言は必要なのですか?? 正規の書き方を教えてください。

  • double型をfloat型に強制変換

    ある計算シミュレーションにおいてdouble型で不動点少数の変数を 宣言して使用しています。たくさんの変数をすべてfloat型に 変更したいのですが、コンパイラオプション (-r16)のような もので簡単に変換できますでしょうか? コンパイラはIntel c++ですがやgnu c++などを使用しています。

  • C++のfor文について

    C++では for ( int i = 0, j = 0; i < 10; i++ ) { } みたいな感じでforのなかで変数の宣言ができます。 ところで上の例ですとint型のiとjを2つ宣言していますが、 もしint型とchar型を宣言したい場合などは char j; for ( int i = 0; i < 10; i++ ) { } みたいにしないといけないのでしょうか? for ( int i = 0, char j; i < 10; i++ ) { } みたいにできると思ってやったらエラーになってしまうので・・。

  • おみくじの出現数とそのビジュアル化

    おみくじを引いて大吉のでる回数と少しビジュアル的に10個毎に*を1個表示し、*を5個表示する毎にスペース(" ")を表示させようと思ってます。 以下のようなコードを書いたのですが、2つ問題があります。 大吉(141): ***** ***** ****とならないで、 大吉(141): ***** ***** **と2行になります。 スペースを入れた分、*の数が減ってしまうのか*の数が合いません。 解決策がお分かりの方、お教え願います。 public class Omikuzi { public static void main(String[] args) // 変数maxを宣言し7で初期化する⇒求める数字の最大値!? // 出現率収納用の変数を指定する int max = 7; int sum0 = 0; // カウンタ変数iに0を代入し、iを1000繰り返す。繰り返したあと インクリメント(1加算)する for (int i = 0; i < 1000; i++) { // Mathクラスのrandomメソッドを利用して変数randomNum に0~1未満の少数を代入する double randomNum = (Math.random()); // randomNumをmax倍し(0~max未満の小数にする)それを int型にキャストして変数numに代入する int num = (int) (randomNum * max) // if文でnumのそれぞれの値が現れたときの場合1をたし て全体の数をカウントする if (0 == num) { sum0 += 1; } } System.out.println("大吉:"+"("+sum0+")"); for (int j = 1; j <= (sum0 / 10); j++) if (j % 6 != 0) { System.out.print("*"); } else { System.out.print(" "); } } }

  • getchar,isalphaについて

    C言語を習いはじめてまもない者です。getcharとisalphaについて教えてください。  まず、getcharから。この関数は、キーボードから文字を一文字ずつ読み、読み出した文字を返す。といった働きをするそうですが、この関数を用いて、取り込んだ文字をなぜか、int型で宣言した変数に代入しています。(例:int aなどのaに取り込んだ文字を代入している。)なぜ、文字を取り込んでいるのに、intで宣言した変数に代入すのでしょうか?charで宣言した変数に代入しなくていいのですか?  次に、isalphaについてです。この関数は、変数に代入されている文字が数字か文字かを判断して、文字が入力されていると、0以外の値を返す関数だそうです。しかし、この関数も、変数の宣言がintです。なぜ、charではなくintで宣言するのでしょうか?

  • C言語の配列の宣言について

    20年以上前に発行された本に書いてある、利用したいCのコードがあります。 JavaやPHPは使ったことがありますが、Cは触ったことすらありません。 とりあえずメモ帳に打ち出して、codepadでC codeで実行してみましたが、正常に動作しません。 どこがおかしいのか、ご教示ください。 よろしくお願いします。 ---- #include <stdio.h> #include <math.h> #define N 20; int main( int argc, char **argv ) { double u[N+1], w[N+1]; double k=0.001; double h, r, s; int i, j; h= 1.0/(double)N; r= k/(h*h); s= 1.0-2.0*r; for( i=0; i<=N; i++ ) w[i]=0.0; for( i=1; i<N; i++ ) u[i]=1.0; u[0]=0.0; u[N]=0.0; for(j=1;j<200;j++){ if((j%10)==0) { printf("%5.31f",(double)j*k); for(i=0;i<=N;i+=2) printf("%5.31f",u[i]); printf("\n"); } for( i=0; i<=w; i++ ) w[i]=r*(u[i+1]+u[i-1])+s*u[i]; for( i=1; i<N; i++ ) u[i]=w[i]; } return 0; }

  • 正規表現の検索について

    正規表現で以下をさがしたいのですが・・・ Cの配列要素を指定している行(a[i+j]みたいなものを含んでいるやつ) や、Cのコメントの始まりの行(//あるいは/*) 、Perlのコメントを含まない行(#を含んでいない行) 、Cの変数宣言らしい行(int, char, float, doubleのいずれかを含んでいる. 構造体は無視)はどのようにしたらいいでしょうか。基本的にAを含むなどの検索はできるのでですが、これらは浮かばなくて。。。 誰か教えてくださいませ(><)

    • ベストアンサー
    • Perl
  • C言語のfloat型変数の値代入と表示について

    float型変数の値代入と表示について質問があります。 #include <stdio.h> int main(void) {  float flVal = 50.456;  printf("float型変数:%f", flVal);  return 0; } 上記を実行すると、「float型変数:50.456001」と表示されました。 また、float flVal = 50.1; と変えて実行すると、「float型変数:50.099998」と表示されました。 それぞれ期待していた結果は、 「float型変数:50.456000」、「float型変数:50.100000」だったのですが 代入した値と結果が微妙に異なる理由は何でしょうか。よろしくお願いします。

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

  • C++ 法線の計算

    Depthmapをもつ画像のピクセルごとに法線を計算する関数を作成したのですが、いまいち計算が遅いです。if文をできるだけ使わないようにしたり、自分なりに変更したのですが、どなたかアドバイスを頂けないでしょうか。 Visual Studio, windows7, C++ です。 Tvector3<float> calc_normal(Tvector3<float> p1, Tvector3<float> p2, Tvector3<float> p3){ Tvector3<float> v1; Tvector3<float> v2; Tvector3<float> cross; float length; Tvector3<float> n; v1 = p1 - p2; v2 = p3 - p2; cross = v2.cross(v1); /* 外積v2×v1の長さ|v2×v1|(= length)を求める */ cross.normalize(); /* 長さ|v2×v1|が0のときは法線ベクトルは求められない */ if (length == 0.0f) { //cout<<"lenth=0"<<endl; //break (); } /* 外積v2×v1を長さ|v2×v1|で割って法線ベクトルnを求める */ //cout<<cross<<endl; return cross; } void calc_all_noraml(Ttexturef dmap, vector<Tvector3<float>> &n){ int w = dmap.getWidth(); int h = dmap.getHeight(); Tvector3<float> pc,pl,pr,pd,pu; int j=0; cout<<j<<endl; for(int i=0; i<w; i++){ vector<Tvector3<float>> temp; pc = Tvector3<float>(i,j,return_depth(dmap,i,j)); if(i-1 > 0)pl = Tvector3<float>(i-1,j,dmap.get(i-1,j).r); if(i+1 < w)pr = Tvector3<float>(i+1,j,dmap.get(i+1,j).r); pu = Tvector3<float>(i,j+1,dmap.get(i,j+1).r); if(i-1 > 0)temp.push_back(calc_normal(pl,pu,pc)); if(i+1 < w)temp.push_back(calc_normal(pc,pu,pr)); Tvector3<float> sum(0,0,0); for(int k=0; k<(int)temp.size(); k++){ sum += temp.at(k); } sum.normalize(); //cout<<sum<<endl; n.push_back(sum); } for(j=1;j<(h-1);j++){ cout<<j<<endl; int i=0; vector<Tvector3<float>> temp; pc = Tvector3<float>(i,j,return_depth(dmap,i,j)); pr = Tvector3<float>(i+1,j,return_depth(dmap,i+1,j)); pu = Tvector3<float>(i,j+1,return_depth(dmap,i,j+1)); pd = Tvector3<float>(i,j-1,return_depth(dmap,i,j-1)); temp.push_back(calc_normal(pc,pu,pr)); temp.push_back(calc_normal(pc,pr,pd)); Tvector3<float> sum(0,0,0); for(int k=0; k<(int)temp.size(); k++){ sum += temp.at(k); } sum.normalize(); n.push_back(sum); temp.clear(); for(int i=1; i<(w-1); i++){ Tvec

専門家に質問してみよう