#include <iostream>
int main(void)
{
double x=1234.5678;
std::cout << x << std::endl;
std::cout << std::scientific << x << std::endl;
std::cout << std::fixed << x << std::endl;
std::cout << std::defaultfloat << x << std::endl;
return 0;
}
|
二分法のプログラム、元々の C プログラムでは、固定形式も使っていたのだった。
/*
* bisection.c -- 二分法 (bisection method) で方程式 f(x)=0 を解く
* コンパイル: gcc -o bisection bisection.c -lm
* 実行: ./bisection
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
int i, maxitr = 100;
double alpha, beta, a, b, c, eps;
double fa, fb, fc;
double f(double);
printf(" 探す区間の左端α, 右端β, 許容精度ε=");
scanf("%lf %lf %lf", &alpha, &beta, &eps);
a = alpha;
b = beta;
fa = f(a);
fb = f(b);
if (fa * fb > 0.0) {
printf(" f(α) f(β) > 0 なのであきらめます。\n");
exit(0);
}
else {
printf("f(%20.15f)=%9.2e, f(%20.15f)=%9.2e\n", a, fa, b, fb);
for (i = 0; i < maxitr; i++) {
c = (a + b) / 2;
fc = f(c);
if (fc == 0.0)
break;
else if (fa * fc <= 0.0) {
/* 左側 [a,c] に根がある */
b = c;
fb = fc;
}
else {
/* 左側 [a,c] には根がないかもしれない。[c,b] にあるはず */
a = c;
fa = fc;
}
printf ("f(%20.15f)=%9.2e, f(%20.15f)=%9.2e\n", a, fa, b, fb);
if ((b - a) <= eps)
break;
}
printf ("f(%20.15f)=%e\n", c, fc);
}
return 0;
}
double f(double x)
{
return cos(x) - x;
}
これを C++ に直すと次のようになる。 std:: つけると、ゲップが出そう。
/*
* bisection.cpp -- 二分法 (bisection method) で方程式 f(x)=0 を解く
* コンパイル: gcc -o bisection bisection.c -lm
* 実行: ./bisection
*/
#include <iostream>
#include <iomanip>
#include <cmath>
int main(void)
{
int i, maxitr = 100;
double alpha, beta, a, b, c, eps;
double fa, fb, fc;
double f(double);
std::ios_base::fmtflags original_flags = std::cout.flags();
std::cout << " 探す区間の左端α, 右端β, 許容精度ε=";
std::cin >> alpha >> beta >> eps;
a = alpha;
b = beta;
fa = f(a);
fb = f(b);
if (fa * fb > 0.0) {
std::cout << " f(α) f(β) > 0 なのであきらめます。" << std::endl;
exit(0);
}
else {
std::cout << "f("
<< std::fixed << std::setw(20) << std::setprecision(15) << a
<< ")="
<< std::scientific << std::setw(9) << std::setprecision(2) << fa
<< ", f("
<< std::fixed << std::setw(20) << std::setprecision(15) << b
<< ")="
<< std::scientific << std::setw(9) << std::setprecision(2) << fb << std::endl;
for (i = 0; i < maxitr; i++) {
c = (a + b) / 2;
fc = f(c);
if (fc == 0.0)
break;
else if (fa * fc <= 0.0) {
/* 左側 [a,c] に根がある */
b = c;
fb = fc;
}
else {
/* 左側 [a,c] には根がないかもしれない。[c,b] にあるはず */
a = c;
fa = fc;
}
std::cout << "f("
<< std::fixed << std::setw(20) << std::setprecision(15) << a
<< ")="
<< std::scientific << std::setw(9) << std::setprecision(2) << fa
<< ", f("
<< std::fixed << std::setw(20) << std::setprecision(15) << b
<< ")="
<< std::scientific << std::setw(9) << std::setprecision(2) << fb
<< std::endl;
if ((b - a) <= eps)
break;
}
std::cout << "f("
<< std::fixed << std::setw(20) << std::setprecision(15) << c
<< ")=";
std::cout.flags(original_flags);
std::cout << std::scientific << std::setprecision(6) << fc << std::endl;
}
return 0;
}
double f(double x)
{
return cos(x) - x;
}