2.4 実数の簡単な入出力と計算 -- 2次方程式を解く

今回も (C 流の scanf() & printf() ではなくて) スト リームを使って入出力をする。 ここで一つの困難が出現する。 数値計算プログラミングでは、結果を数値で出力する際に、 書式の指定をすることが必須であるが、 C++ で書式の指定をするのは思いの外面倒である。 C では %20.15f だけで済むことを一体どうやるのか、 以下のサンプル・プログラムを見てもらいたい。 世の中には、この理由から、C++ でプログラムを書く場合にも、 ストリームではなくて printf() を使って結果を出力する、 という人が結構いたようである。

quadratic_eq.cpp

   1 /*
   2  * quadratic_eq.cpp
   3  */
   4 
   5 #include <iostream>
   6 #include <iomanip>
   7 #include <cmath>
   8 using namespace std;
   9 
  10 int main(void)
  11 {
  12   double a,b,c,D;
  13   cout << setprecision(15);
  14   cout.setf(ios::fixed, ios::floatfield);
  15   cout << "a,b,c: ";
  16   cin >> a >> b >> c;
  17   D = b * b - 4 * a * c;
  18   if (D >= 0)
  19     cout << setw(20) << (-b+sqrt(D))/(2*a) << ", "
  20          << setw(20) << (-b-sqrt(D))/(2*a) << endl;
  21   else
  22     cout << setw(20) << -b/(2*a) << "±"
  23          << setw(20) << sqrt(-D)/(2*a) << " i" << endl;
  24   return 0;
  25 }

コンパイルと実行結果

   1 oyabun% g++ -o quadratic_eq quadratic_eq.cpp
   2 oyabun% ./quadratic_eq
   3 a,b,c: 1 2 1
   4   -1.000000000000000,   -1.000000000000000
   5 oyabun% ./quadratic_eq
   6 a,b,c: 1 1 1
   7   -0.500000000000000±   0.866025403784439 i
   8 oyabun%

率直に言って、 C++ のこのあたりの機能を設計した人間は馬鹿だったのだと思う。

参考: https://www.horstmann.com/ にある ``The March of Progress''

1980: C
printf("%10.2f", x);
1988: C++
cout << setw(10) << setprecision(2) << fixed << x;
1996: Java
java.text.NumberFormat formatter = java.text.NumberFormat.getNumberInstance(); 
formatter.setMinimumFractionDigits(2); 
formatter.setMaximumFractionDigits(2); 
String s = formatter.format(x); 
for (int i = s.length(); i < 10; i++) System.out.print(' '); 
System.out.print(s);
2004: Java
System.out.printf("%10.2f", x);

桂田 祐史
2018-11-04