MOVE
(ポイント還元:1%)
|
|
|
|||||||
|
float型とdouble型の計算速度はどちらが速いですか?精度のビット数によって変わるとか、floatは実は内部ではdoubleに変換する分時間がかかるとか、配列を大量に計算する場合はキャッシュのヒットやメモリ転送、SIMDの並列化によってfloatの方が速いとか、情報がたくさんあって決めかねています。これはやはり、実際にプログラム組んでみて試して決めなさいって感じですか? (2009/12/02 00:31:20) doubleのほうがfloatよりもデータ量が多いので、当然、計算等の処理に時間がかかります。それ以外では、ハード側の仕様によります。ただし、floatとdouble等の実数型は、グラフィックスや科学計算等(多量データの処理)に使われるので、どの型でも、高速に処理されるようにベストなハード仕様になっているはずです。しかし、C/C++の標準関数では、doubleが使われているので、floatを使うと、doubleへの型変換で処理時間がかかります。グラフィックスが目的で、DirectXを利用する場合は、そのAPIはfloatが使われているので、上記とは逆に、doubleを使うと、floatへの型変換で処理時間がかかります。普通は気にならない範囲ですが、ループで繰り返す処理では、その微妙な違いが積み重なって、明らかな違いになります。よって、処理内容によっても、違ってきますので、実際にプログラム組んでみて試して決めて下さい。しかし、Cならば、質問者さんのような立場の方々のために、typedefが用意されています。typedefで、後から型の変更をしやすいコードの記述にします。C++ならば、typedefも使えますが、テンプレート(テンプレート関数、又はテンプレートクラス)という機能が便利です。テンプレート引数に、floatか、doubleを指定して選択するようにします。typedefも、テンプレートも、コンパイル時に指定した型を使うように判断されます。実行時での判断では無いので、「実際にプログラム組んでみて試して決める」という目的に合っています。<typedefの使い方>例えば、typedef double MyType;とすれば、あとはMyTypeという型名で、各処理のコードを記述します(MyTypeは例で、名前は自由)。このtypedefの箇所だけ、後からfloat等の別の型に変更します。<テンプレートの使い方>例えば、void func(double data) という関数のテンプレート関数では、template <typename MyType> void func(MyType data){}として定義します。この関数を使うときは、普通にdouble x = 2.345;func(x);とすれば、型MyTypeは、double型だと自動判断されます。なお、複数の型を指定することも可能です。例えば、template <typename MyType1, typename MyType2> void func(MyType1 data1, MyType2 data2){}上記のように、未定の型のオブジェクトは、自動判断させるために、引数に指定する必要があります。しかし、そのような事を気にしたく無い場合は、テンプレートクラスを使って下さい。クラスのオブジェクト生成の際に、MyClass<double> obj;というように、型指定をします。回答量上限の制限がありますので、詳しい内容の解説は省略しますが、入門書を見れば、それ程難しくは無いです。なお、Cプログラマーであっても、Visual C++のように、C と C++ を兼用したコンパイラーを使っているのであれば、基本はC書式で、都合の良い機能だけ、C++の機能を利用すると良いです。(C++は、Cを基本にして、新たな機能を追加した言語ですので、C++でC書式を使っても、何も問題無いです)私は、グラフィックス関係でも、科学計算関係でも、いろいろな条件で使うプログラムは、テンプレートで定義しています。なお、テンプレートは、前述の通り、基本はコンパイル時に判断処理がされます。しかし、C++には、動的な型変換や、動的なオブジェクト生成などの、動的(実行時の判断処理)な機能が用意されていますので、それらの機能を取り入れて、動的なプログラムモジュールにすることも可能です。しかし、質問の件ならば、コンパイル時判断とか、実行時判断とか、あまり気にする必要は無いです。テンプレートで作成すれば、質問の件も含めて、汎用性の高いプログラムを作れますので、ぜひ、試してみて下さい。[追記: 実際に試す別の理由]科学技術計算で使われるのでしたら、計算誤差の関係で、double型でも不足という場合は多いです。場合によっては、精度の高い型を自分で作らなければならないです。グラフィックスの場合では、上記の件は、それ程気になりません。ただし、「あるベクトルが、別のベクトルと同位置で重なる場合」とか、「あるベクトルと、別のベクトルが直行する場合」等の計算が必要ならば、やはり、floatでは、精度不足を感じる事もよく有ります。よって、「速度を気にしている場合では無い」というケースもよくありますので、実際に試して確認して下さい。なお、C++ならば、自分で型を定義することは可能ですので、型を作る場合も考慮して、テンプレートの利用をおすすめします。 (その他の回答はこちら) C++の二次方程式プログラムhttp://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1433618499虚数解の場合、a=0の場合、実数解の場合で書けって書いてある問題だし、それが分からないんです・#include <iostream>#include <cmath>using namespace std;int main() {double a,b,c;cin >> a >> b >> c;if(a==0) {cout << (-c/b) << '\¥n';}else if((b*b-4*a*c)<0) {cout << (-b/2/a) << 'i' << sqrt(4*a*c-b*b)/2/a << '\¥n';}else {}return 0;}elseの下を埋めろって言う風に言われてもそう(色々条件増やすのは)はしないですよね… (2009/12/01 21:55:18) /*あなたの前の質問に折角回答したら、同じ問題で新しく質問していた。しょうがないので、前の回答をコピーしてまた回答します。回答→_こうすればいいんです。プログラムは丁寧に書けば、丁寧に働きます。ざっと書いて、マシンに渡してからいくら頑張っても時間が経つだけです。ゆっくり丁寧に書いて、コンピュータにはサッサと働いてもらいましょう。*/#include_<iostream>#include_<cmath>using_namespace_std;int_main()_{__double__a,b,c,d;__cin_>>_a_>>_b_>>_c;__if(a==0)_{____cout_<<_"x_=_"_<<_(-c/b)_<<_'\¥n';__}_else_{____d_=_b*b-4*a*c;____if(d>0)_{______cout_<<_"x1_=_"_<<_(-b+sqrt(d))/(2*a)_<<_'\¥n';______cout_<<_"x2_=_"_<<_(-b-sqrt(d))/(2*a)_<<_'\¥n';____}_else____if(d<0)_{______cout_<<_"x1_=_"_<<_-b/(2*a);______cout_<<_"+_j("_<<_+sqrt(-d)/(2*a)_<<_")\¥n";______cout_<<_"x2_=_"_<<_-b/(2*a);______cout_<<_"+_j("_<<_-sqrt(-d)/(2*a)_<<_")\¥n";____}_else____if(d==0)_{______cout_<<_"x_=_"_<<_-b/(2*a);____}__}__return_0;}/*_出力:0_2_3x_=_-1.51_5_2x1_=_-0.438447x2_=_-4.561551_2_5x1_=_-1+_j(2)x2_=_-1+_j(-2)*/ (その他の回答はこちら) 『至急』RLC回路の位相差を求めるプログラムを作ったのですが位相差が正しく表示されません。 それぞれ、xc,xlの部分を使わずにXC(f,c)とXL(f,l)と入力すると正しい値が表示されます。関数の値を代入して『atan』の中で使うことはできないのでしょうか? #include <stdio.h> #include <math.h> double XL(double a, double b) /* XLの値を返す関数*/ { double xl; xl=2*3.14*a*b; return(xl); } double XC(double c, double d) /*XCの値を返す関数*/ { double xc; xc=1/(2*3.14*c*d); return(xc); } double Fr(double e,double g) /*共振周波数を求め値を返す関数*/ { double Fr; Fr=1/(2*3.14*sqrt(e*g)); return(Fr); } int main(void) { int kairo; double r,l,c,f,xc,xl; printf("回路を選択してください。\\\\n"); printf("RLC直列 ・・・1\\\\n"); printf("RL直列 ・・・2\\\\n"); printf("RC直列 ・・・3\\\\n"); printf("LC直列 ・・・4\\\\n"); printf("RLC並列 ・・・5\\\\n"); printf("RL並列 ・・・6\\\\n"); printf("RC並列 ・・・7\\\\n"); printf("RC並列 ・・・8\\\\n"); printf("回路:"); scanf("%d",&kairo); /*回路選択*/ printf("電源の周波数を入力してください"); printf("周波数[Hz]:"); scanf("%lf",&f); /*周波数入力*/ printf("素子の値を入力したください。素子が存在しない場合は『0』を入力してください。\\\\n"); printf("指数部の入力は『10^-6』⇒『10E-6』のように入力してください。\\\\n"); printf("R[Ω]:"); scanf("%lf",&r); printf("L[H]:"); scanf("%lf",&l); printf("C[F]:"); scanf("%lf",&c); xc=XC(f,l); xl=XL(f,c); switch(kairo) { case 1: printf("位相差[deg]:%.1f\\\\n",atan((xl-xc)/r)*180.0 /3.14);break; case 2: printf("位相差[deg]:%.1f\\\\n",atan(xl/r)*180/3.14);break; case 3: printf("位相差[deg]:%.1f\\\\n",atan(xc/r)*180/3.14);break; case 5: printf("位相差[deg]:%.1f\\\\n",atan(r*((1/xc)-(1/xl)))*180/3.14);break; case 6: printf("位相差[deg]:%.1f\\\\n",atan(r*(1/xl))*180/3.14);break; case 7: printf("位相差[deg]:%.1f\\\\n",atan(r*(1/xc))*180/3.14);break; } if(kairo==1 || kairo==4 || kairo==5 || kairo==8) { printf("共振周波数[Hz]: %.1f\\\\n",Fr(l,c)); } return(0); } 訂正等お願いします。 (2009/11/30 21:03:09) javaプログラミングで質問です。import java.io.*;import java.text.*;import java.util.*;class Student{ String name; int id; float gpa;}public class StudentList{ static void printStudents(Student[] student, int nStudents) { String b = " "; int i; for (i = 0; i < nStudents; i++) { System.out.print("Name = " + student[i].name); System.out.print(b.substring(student[i].name.length())); System.out.print(" ID = " + new DecimalFormat("0000000").format(student[i].id)); System.out.println(" gpa = " + student[i].gpa); } } public static void main(String[] argv) throws Exception { BufferedReader fin; fin = new BufferedReader(new FileReader("students.txt")); int nStudents = 0; Student[] student = new Student[100]; while (fin.ready()) { Student aStudent = new Student(); aStudent.name = fin.readLine(); aStudent.id = new Double(fin.readLine()).intValue(); aStudent.gpa = new Double(fin.readLine()).floatValue(); fin.readLine(); if (nStudents < student.length) student[nStudents++] = aStudent; } fin.close(); for (int i = 0; i < nStudents; i++) { for (int j = i + 1; j < nStudents; j++) { if (student[i].name.compareTo(student[j].name) > 0) { Student temp = student[i]; student[i] = student[j]; student[j] = temp; } } } printStudents(student, nStudents); }} このプログラムにインプットする生徒の数、ファイルからデータを読み込む代わりにユーザーにインプットしてもらう、名前順ではなくてGPA順にするという項目を追加するにはどこにどのようなコードブロックを挿入すればよいのでしょうか? (2009/11/30 11:09:21) >ファイルからデータを読み込む代わりにユーザーにインプットしてもらうnew BufferedReader(new FileReader("students.txt"));のFileReaderを標準入力にします。>名前順ではなくてGPA順compareToを使うのをfloatにする。そのまま(float)だと使えないから、ラッパクラス(Float)を利用するか、StudentクラスにComparable を実装するかしたら良いと思いますよ。 (その他の回答はこちら) C++のforについて#include <iostream>#include <cmath>using namespace std;int main() { static const int N = 2; double va[N]={3,-4}; double vb[N]={4,3}; double a,b; double p; for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) { } } cout << "va + vb = (" ; for (int i = 0; i < N; i++) { cout << va[i] + vb[i]; if (i < N - 1) { cout << ", "; } } cout << ")" << '\¥n'; cout << "va - vb = (" ; for (int i = 0; i < N; i++) { cout << va[i] - vb[i]; if (i < N - 1) { cout << ", "; } } cout << ")" << '\¥n'; p = 0; for (int i = 0; i < N; i++) { p += va[i] * vb[i]; } cout << "va・vb = " << p << '\¥n'; a = 0; for (int i = 0; i < N; i++) { a += va[i] * va[i]; } a = sqrt(a); b = 0; for (int i = 0; i < N; i++) { b += vb[i] * vb[i]; } b = sqrt(b); if (a * b != 0) { cout << "cosθ = " << p / (a * b) << '\¥n'; } return 0;}double p;の下の for (int i = 0; i < N; i++) { for (int i = 0; i < N; i++) { } } って必要ですか?抜いても結果は同じでした… (2009/11/30 00:56:41) |
||||||||||||||||||||||||
|
会社概要|個人情報保護方針|FAQ|退会手続き|よくある質問|お問合せ|サイトマップ |
||
|
|
||