掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29700

大きい数字の型宣言と書式について
投稿者---ばかもの(2007/02/03 13:50:11)


初歩の質問ですいません。よければアドバイスお願いします。
計算をしていてすごく大きな値(50億くらい)が出てきました。
この場合ではdouble型では値が、マイナスになるなど無理でした。
この値を表示するための型と書式を教えてください。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:大きい数字の型宣言と書式について 29701 akg 2007/02/03 15:13:57
<子記事> Re:大きい数字の型宣言と書式について 29702 yoh2 2007/02/03 15:24:16
<子記事> Re:大きい数字の型宣言と書式について 29703 かずま 2007/02/03 15:30:24


No.29701

Re:大きい数字の型宣言と書式について
投稿者---akg(2007/02/03 15:13:57)


>計算をしていてすごく大きな値(50億くらい)が出てきました。
>この場合ではdouble型では値が、マイナスになるなど無理でした。

当方(Borland C++ Compiler)では、
double型で10の308乗くらいまで扱えます。

お使いの処理系は何ですか?
50億って10の9乗のオーダーですから、
double型で十分扱えるはずだと思うのですけど。

整数型と混同してないですよね?


この投稿にコメントする

削除パスワード

No.29702

Re:大きい数字の型宣言と書式について
投稿者---yoh2(2007/02/03 15:24:16)


最終的にdoubleに代入しているだけで、途中の計算がintのまま、ということはないでしょうか?

サンプル:
#include <stdio.h>

int main(int argc, char **argv)
{
    double result1, result2;
    int a = 1000000, b = 5000;

    /* int で計算している a * b ですでに結果がおかしいから、doubleに代入しても無駄 */
    result1 = a * b;

    /* 途中もdoubleなら正しい値になる */
    result2 = (double)a * b;

    printf("result1 = %f\nresult2 = %f\n", result1, result2);

    return 0;
}



この投稿にコメントする

削除パスワード

No.29704

Re:大きい数字の型宣言と書式について
投稿者---ばかもの(2007/02/03 15:42:00)


貴重なご意見ありがとうございます。
int型にはしていないと思います。
実際におかしいところだけを下に載せてみました。
実行してみたら計算結果に誤りがあります。何かミスがあればアドバイス
よろしくお願いします。

#include<stdio.h>


main(){
        
        static int x[5] = {194, 96,208,152,241},
                   y[5] = {222, 33, 42, 90,197},
                   w[5] = {300,160,243,150,120},
                   z[5] = {210, 15, 83,87,222};
        
    
    int m;
    double q[5],r[5],s[5],Q,R,S;
     
  for(m=0;m<5;m++){

    q[m] = w[m]*w[m]*x[m]*x[m] + z[m]*z[m]*x[m]*x[m];
    r[m] = w[m]*w[m]*x[m]*y[m] + z[m]*z[m]*x[m]*y[m];
    s[m] = w[m]*w[m]*y[m]*y[m] + z[m]*z[m]*y[m]*y[m];
    }

  printf("%f %f %f %f %f\n",q[0],q[1],q[2],q[3],q[4]);
  printf("%f %f %f %f %f\n",r[0],r[1],r[2],r[3],r[4]);
  printf("%f %f %f %f %f\n",s[0],s[1],s[2],s[3],s[4]);
 
  Q= q[0]+q[1]+q[2]+q[3]+q[4];
  R= r[0]+r[1]+r[2]+r[3]+r[4];
  S= s[0]+s[1]+s[2]+s[3]+s[4];
        
    printf("%f %f %f\n",Q,R,S);

        
}



この投稿にコメントする

削除パスワード

No.29705

Re:大きい数字の型宣言と書式について
投稿者---akg(2007/02/03 15:54:39)


yoh2さんの回答のとおりではないですか。
forループの中で、右辺の結果がint型で扱える範囲を超えてます。


この投稿にコメントする

削除パスワード

No.29706

Re:大きい数字の型宣言と書式について
投稿者---ばかもの(2007/02/03 16:27:46)


すいませんでした。forループの中の計算式に(double)を付け加えたのですがq[0],r[0],s[0]の値はいいもののq[4],r[4],s[4]の値には前と同じくマイナスがついています。これはなんでなのでしょうか?

何度もすいません。


この投稿にコメントする

削除パスワード

No.29707

Re:大きい数字の型宣言と書式について
投稿者---akg(2007/02/03 16:34:02)


>forループの中の計算式に(double)を付け加えた

どういう風に付け加えたか、そこのコードを見せてくださると、
正しいかどうかが一発でわかるのですけれど…。
どう付け加えたかは、こちらからは見えないわけですし。


この投稿にコメントする

削除パスワード

No.29708

Re:大きい数字の型宣言と書式について
投稿者---ばかもの(2007/02/03 16:37:38)


本当にすいません。下のように付け加えました。


#include<stdio.h>


main(){
        
        static int x[5] = {194, 96,208,152,241},
                   y[5] = {222, 33, 42, 90,197},
                   w[5] = {300,160,243,150,120},
                   z[5] = {210, 15, 83,87,222};
        
    
    int m;
    double q[5],r[5],s[5],Q,R,S;
     
  for(m=0;m<5;m++){

    q[m] = (double)w[m]*w[m]*x[m]*x[m] + z[m]*z[m]*x[m]*x[m];
    r[m] = (double)w[m]*w[m]*x[m]*y[m] + z[m]*z[m]*x[m]*y[m];
    s[m] = (double)w[m]*w[m]*y[m]*y[m] + z[m]*z[m]*y[m]*y[m];
    }

  printf("%f %f %f %f %f\n",q[0],q[1],q[2],q[3],q[4]);
  printf("%f %f %f %f %f\n",r[0],r[1],r[2],r[3],r[4]);
  printf("%f %f %f %f %f\n",s[0],s[1],s[2],s[3],s[4]);
 
  Q= q[0]+q[1]+q[2]+q[3]+q[4];
  R= r[0]+r[1]+r[2]+r[3]+r[4];
  S= s[0]+s[1]+s[2]+s[3]+s[4];
        
    printf("%f %f %f\n",Q,R,S);

        
}



この投稿にコメントする

削除パスワード

No.29709

Re:大きい数字の型宣言と書式について
投稿者---yoh2(2007/02/03 20:49:11)


>    q[m] = (double)w[m]*w[m]*x[m]*x[m] + z[m]*z[m]*x[m]*x[m];
>    r[m] = (double)w[m]*w[m]*x[m]*y[m] + z[m]*z[m]*x[m]*y[m];
>    s[m] = (double)w[m]*w[m]*y[m]*y[m] + z[m]*z[m]*y[m]*y[m];

それぞれの代入式の右辺の第2項(z[m]*z[m]* で始まっている項)が相変わらずintのままですね。

何故頭にdoubleを付けただけではダメなのかが分からなければ、演算子の順位と
型の格上げ規則を確認し直しましょう。


この投稿にコメントする

削除パスワード

No.29710

Re:大きい数字の型宣言と書式について
投稿者---ばかもの(2007/02/04 11:53:23)


わかりました。勉強不足ですいません。
ありがとうございました。



この投稿にコメントする

削除パスワード

No.29703

Re:大きい数字の型宣言と書式について
投稿者---かずま(2007/02/03 15:30:24)


#include <stdio.h>

int main()
{
    double a = 5000003566.;
    printf("%d\n", a);
    printf("%.f\n", a);
    return 0;
}

実行結果

-18874368
5000003566



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧