• 締切済み

プログラムする言語によって精度は変わる?

当たり前のことかもしれませんが 同じ計算をするプログラムを作っても double型の計算をした場合 計算結果が変わるものでしょうか? CとCOBOLを比較した結果違いがでました。 なんで違うのか説明が載っているものは どこかにあるでしょうか?

みんなの回答

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.7

>検索した知識ですがCOBOLには浮動小数ってないのでは COBOLにもdouble型はあります。int型も。 ・PIC 999.なら文字型。 ・PIC 999 COMP.でパック型。 ・COMP-2.ならたしかdouble型です。 昔の記憶なので、型の書き方は間違ってるかも知れませんが。 参考まで。

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.6

C言語の場合、CPU/OSで違ったりします。 また、コンパイルオプションでも計算精度は違います。 この辺りの話しは検索すれば多くの情報が出てきますので一度は見るといいでしょう。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.5

検索した知識ですがCOBOLには浮動小数ってないのでは 整数部の桁数と小数部の桁数を自分で決めて1桁1バイトとかで10進演算するので小数演算の結果が違うのはあたりまえです メモリは無駄になりますが誤差が出ないですね

  • nasu0327
  • ベストアンサー率14% (7/50)
回答No.4

複雑な計算を一気に求めたりする計算式の場合、 (答でない)中間結果に対する値の精度が、言語により異なる事があります。 あとは、有効桁数 Cobolだと18桁まで定義できますが、他の言語はどうでしょう?

  • Willyt
  • ベストアンサー率25% (2858/11131)
回答No.3

コンパイラーが計算をする場合、一つの数字にどれだけの桁数を割り当てるかは設計によってすべて異なりますからCの結果とCOBOLの結果に違いが出て来るのは当然です。これは実数計算の場合に桁落ち現象がどうしても起きるので、その影響が出るのです。たとえば、1.04と1.03 を計算するとき、3桁の計算なら2.07で、二桁をとると2.1となりますが、2桁しか割り当てないと2.0になってしまいます。これを繰り返すとかなりの差が出て来ることが起き得ます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

単純な加減算・除乗算の場合は表示上の丸め誤差以外は差がないと思います。ただし、関数が入ってくると関数の作り方の違いで差が出る可能性は高いです。 この場合は、お使いの言語の関数ごとに誤差について書かれた資料を探す必要があります。CだからCOBOLだからの問題ではないです。同じCOBOLでもメーカーごとに違うと思います。

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

実際にどういう処理系でどのような型のデータに対しどのような処理をしたのか, あるいは「計算結果が変わる」といっても「どの程度変わるのか」(計算が無意味になるくらい違うのか, それとも本当にわずかに違うだけなのか) がわからないから抽象的にならざるを得ませんが, 言語が違えば同じ計算に対し違う実装をしていても不思議ではないし, その結果として計算した答えが違ったとしてもおかしくはない.

関連するQ&A

  • C++が最初のプログラム言語

    昔コボルをやっていた者ですが、 C++を最初に勉強している人もしくは、 仕事にしている人はいませんか? 私はVBが比較的簡単に習得できると思い、 簡単なものを作成したのですが、 やっていて、おもしろくない(コボルもそうでした。)のですが、 C++の本を買ってみて、色々いじっていると、 おもしろいと思ったのですがこんな感じで勉強を すすめてある程度習得した人っているのでしょうか? 掲示板などでは、C++は覚えておいてそんはしない が、習得するのは大変とかいてあるのが多いのです。

  • C言語プログラム

    N次の複素正方行列S,Tの積Uを計算するプログラムを作りたいのですが、実数で正方行列を計算するプログラムと 複素数の積、和のプログラム struct complex { double re; double im; }; を作ったのですが、この二つをまとめるとプログラムができるらしいのですがまとめ方が全然わかりません。どのようにしたらいいかヒントなど教えてください。

  • C言語のプログラムについてですが、

    #include <stdio.h> int main(void) { double r; printf("半径を入力してください:"); scanf("%lf", &r); printf("円周=%f\n", 2.0 * r * 3.14159); printf("円面積=%f\n", r * r * 3.14159); return 0; } 上のC言語のプログラムを参考にして 正三角形一辺を double値でキーボード入力し、次のように高さと 面積を計算するプログラムを教えてください。 よろしくお願いしますl_ω_l 3の平方根は1.73205とします。 [実行結果] ======= 一辺の値を入力してください: 20 高さ=17.320500 面積=173.205000

  • C言語プログラム

    学校のレポートでC言語のプログラムを作りました。ところが実行してみると計算値を表示させるところに -1.#IND00 と表示されます。本当は実数が表示されるはずなに・・・ 多分、私のプログラムが間違っているのだろうと思います。どこが間違っているのか目星をつけるためにこの出力結果の意味を教えてほしいのです。

  • プログラム言語について

    プログラム言語ってJava C PHP C++ (Visual)Basic C#等がありますけど どう違うんですか? それぞれの違いを教えてください

  • 手続き型言語からオブジェクト指向型言語にコンバート

    COBOLで書かれたプログラムをC#、JAVAなどのプログラムに書き換えるって簡単ですか? COBOLは構造化プログラミングと呼ばれ、JAVAなどはオブジェクト指向でタイプが違うのではないかと思うのですがいかがでしょう?

  • プログラム言語って・・・

    はじめまして プログラム言語を勉強したいと思っているのですが、何を勉強したらよいのでしょうか? JAVAとかCとかVBとかCGIとかいろいろありますが、何を勉強したらいいのかわかりません・・ 社会人なのでPCスクールに通う時間もないし金銭的にもそこまで余裕がないので本を買って独学しようと思っています。 巷の求人誌を見るとプログラマーは引っ張りダコです、プログラミングに関しては全くのド素人です、 以前、知人に尋ねたら「何を作るかによって使う言語がちがってくる」と言ってましたがイマイチよくわかりませんでした、 JAVAとかHTMLとかXMLはネットに関する言語だということはわかりますがそれ以外のVBとかCとかC++とかCOBOLとかは何に使うのですか? また今から時代の将来性を考えると、私のようなまっさらの素人は何を勉強したらよいでしょうか? オススメの書籍やサイトが御座いましたら教えて下さいマセ。。

  • C言語での桁落ちの以下のプログラムを教えてください

    C言語の本の問題で答えが書いてなく困っております。 f(x)=xの5乗-ルート(1+xの10乗)+1/{2×ルート(1+xの10乗)}の式が与えられ x=0,1,2・・・50 における f(x) の値を求める場合のプログラムを教えてください。 注**そのまま計算した場合と式を変形して正確に計算した場合を比較せよ(一つのプログラムで両方計算).

  • C言語でintをdoubleに

    C言語でプログラミングを書いています。 10問の問題の正解数に応じて正答率を出すプログラムを書いているのですが、正解数を数えるものをintで定義(seikaiとする)し、正答率の計算結果を出すものをdoubleで定義(rituとする)しました。 seikaiをインクリメントで数え ritu=seikai/10*100 という計算をしました。このrituを%fで表示させようとしても正しく表示されません。intで定義したものを計算に用いて、その計算結果をdoubleで定義したもので表示することはできないのですか?? また、自分で調べたら、ritu=(double)seikai/10*100とやるというものがありましたが、”(double)”を使わずに計算を反映させることはできませんか?

  • C言語のプログラムに関することで質問です。

    C言語のライブラリを利用したプログラムのことで質問なのですが、座標xとyの成分から、ベクトルの角度(t)と大きさ(r)を求めるプログラムを作りました。しかし、このままのプログラムだと、ある場合のときに限り、正しい値が返されなくなるらしいのですが、それはどのような場合で正しい値が返されなくなってしまうのかを教えてください。また、正しい値がでるようにするにはどこをどう直したらよいのでしょうか? 自分でも考えてみたのですが、分からず困っています。分かる方どうかよろしくお願いいたします。 #include <stdio.h> #include <stdlib.h> #include <math.h> #define square(x) ((x) * (x)) //ベクトルの角度θを返す関数 double theta(double x, double y) { return atan(y / x); } //ベクトルの大きさを返す関数 double radius(double x, double y) { return sqrt(square(x) + square(y)); } int main(int argc, char **argv) { double x, y; //x, yは座標 double t, r; //t, rは極座標 if(argc == 3 && (x = atof(argv[1])) && (y = atof(argv[2]))) { t = theta(x, y);  //極座標tを計算 r = radius(x, y); //極座標rを計算   //ベクトルの角度と大きさを表示 printf("t = %f, r = %f\n", t, r); } return 0; }

専門家に質問してみよう