はじめに

編集

bcは、任意精度の計算を行うための言語および計算機です。POSIX標準に準拠しており、C言語に似た構文を持ちますが、いくつかの違いがあります。

BCの概要

編集

BCとは

編集

bcは、任意精度の計算を行うための言語および計算機です。 bcは、数学的な計算やスクリプトの実行に広く利用されます。

基本的な機能

編集
  • 任意精度の計算
  • 変数と配列のサポート
  • 条件分岐とループ
  • ユーザー定義関数
  • 標準および拡張数学関数

BCの起動とオプション

編集

起動方法

編集

bcを起動するには、ターミナルで以下のコマンドを実行します。

bc

コマンドラインオプション

編集

bcには、以下のようなオプションがあります。

コマンドラインオプション
オプション 説明
-l 数学ライブラリを読み込む
-q クワイエットモード(バナーを表示しない)
-s 標準モード(拡張機能を無効にする)
-w 非標準の拡張機能を使用した場合に警告を表示する
-i 強制的に対話モードにする
bc -l  # 数学ライブラリを読み込む

BCの構文

編集

変数と配列

編集

bcでは、変数と配列を使用できます。

x = 10
y = 20
x + y  # 30
配列の例
a[0] = 5
a[1] = 10
a[0] + a[1]  # 15

演算子

編集

bcでは、以下の演算子が利用できます。

演算子
演算子 説明
+ 加算
- 減算
* 乗算
/ 除算
% 剰余
^ べき乗
5 + 3 * 2  # 11

制御構造

編集

bcでは、if文やfor文、while文を使用できます。

if (x > 10) {
    print "x is greater than 10\n"
}

for

編集
for (i = 1; i <= 5; i++) {
    print i, "\n"
}

while

編集
i = 1
while (i <= 5) {
    print i, "\n"
    i++
}

ループのネスト

編集

ループをネストして、より複雑な処理を行うこともできます。

for (i = 1; i <= 3; i++) {
    for (j = 1; j <= 3; j++) {
        print i * j, " "
    }
    print "\n"
}
# 出力:
# 1 2 3 
# 2 4 6 
# 3 6 9

配列とループの組み合わせ

編集

配列とループを組み合わせることで、効率的にデータを処理できます。

配列の合計と平均を計算

編集

カハンの総和アルゴリズム( Kahan summation algorithm )を適用して、配列の要素の合計と平均値を高精度で計算する例です。

define kahan_sum(a[], n) {
    sum = 0
    c = 0  # 補正項
    for (i = 0; i < n; i++) {
        y = a[i] - c
        t = sum + y
        c = (t - sum) - y
        sum = t
    }
    return sum
}

define average(a[], n) {
    sum = kahan_sum(a[], n)
    return sum / n
}

# 配列の定義
a[0] = 1000000.1
a[1] = 1000000.2
a[2] = 1000000.3
a[3] = 1000000.4
a[4] = 1000000.5

n = length(a[])
avg = average(a[], n)
avg  # 1000000.3

配列の最大値を求める

編集

配列の要素の中から最大値を求める例です。

a[0] = 10
a[1] = 50
a[2] = 30
max = a[0]
for (i = 1; i < length(a[]); i++) {
    if (a[i] > max) {
        max = a[i]
    }
}
max  # 50

配列の要素を逆順にする

編集

配列の要素を逆順にする例です。

a[0] = 10
a[1] = 20
a[2] = 30
n = length(a[])
for (i = 0; i < n / 2; i++) {
    temp = a[i]
    a[i] = a[n - 1 - i]
    a[n - 1 - i] = temp
}
a[0]  # 30
a[1]  # 20
a[2]  # 10

フィボナッチ数列の生成

編集

フィボナッチ数列を生成し、配列に格納する例です。

define fibonacci(n) {
    a[0] = 0
    a[1] = 1
    for (i = 2; i < n; i++) {
        a[i] = a[i - 1] + a[i - 2]
    }
    return a[]
}

fibonacci(10)
# 出力:
# a[0] = 0
# a[1] = 1
# a[2] = 1
# a[3] = 2
# a[4] = 3
# a[5] = 5
# a[6] = 8
# a[7] = 13
# a[8] = 21
# a[9] = 34

関数

編集

bcでは、ユーザー定義関数を作成できます。

define square(x) {
    return x * x
}
square(5)  # 25

再帰関数も可能です。

define factorial(n) {
    if (n <= 1) return 1
    return n * factorial(n - 1)
}
factorial(5)  # 120

数学関数とライブラリ

編集

-lオプションを使用すると、数学関数とライブラリを利用できます。

関数一覧
関数名 カテゴリー 解説
s(x) 三角関数 サイン関数(xはラジアン)
c(x) 三角関数 コサイン関数(xはラジアン)
a(x) 逆三角関数 アークタンジェント関数
l(x) 対数関数 自然対数関数
e(x) 指数関数 指数関数
j(x, n) 特殊関数 ベッセル関数
p(x, y) 数学関数 xのy乗
r(x, p) 数学関数 xをp桁で四捨五入
ceil(x, p) 数学関数 xをp桁で切り上げ
f(x) 数学関数 階乗
max(a, b) 数学関数 aとbの最大値
min(a, b) 数学関数 aとbの最小値
perm(n, k) 数学関数 順列
comb(n, k) 数学関数 組み合わせ
fib(n) 数学関数 フィボナッチ数
l2(x) 対数関数 2を底とする対数
l10(x) 対数関数 10を底とする対数
log(x, b) 対数関数 bを底とする対数
cbrt(x) 数学関数 立方根
root(x, n) 数学関数 xのn乗根
gcd(a, b) 数学関数 最大公約数
lcm(a, b) 数学関数 最小公倍数
pi(p) 数学関数 円周率をp桁で計算
t(x) 三角関数 タンジェント関数
a2(y, x) 逆三角関数 アークタンジェント(y/x)
sin(x) 三角関数 サイン関数(s(x)のエイリアス)
cos(x) 三角関数 コサイン関数(c(x)のエイリアス)
tan(x) 三角関数 タンジェント関数(t(x)のエイリアス)
atan(x) 逆三角関数 アークタンジェント(a(x)のエイリアス)
atan2(y, x) 逆三角関数 アークタンジェント(a2(y, x)のエイリアス)
r2d(x) 単位変換 ラジアンを度に変換
d2r(x) 単位変換 度をラジアンに変換
frand(p) 乱数生成 0以上1未満の乱数(p桁)
ifrand(i, p) 乱数生成 0以上i未満の乱数(p桁)
i2rand(a, b) 乱数生成 a以上b以下の乱数
srand(x) 乱数生成 符号をランダムに反転
brand() 乱数生成 ランダムな真偽値(0または1)
band(a, b) ビット演算 ビット単位のAND
bor(a, b) ビット演算 ビット単位のOR
bxor(a, b) ビット演算 ビット単位のXOR
bshl(a, b) ビット演算 ビット単位の左シフト
bshr(a, b) ビット演算 ビット単位の右シフト
bnotn(x, n) ビット演算 ビット単位のNOT(nバイト)
bnot8(x) ビット演算 8ビットのビット単位のNOT
bnot16(x) ビット演算 16ビットのビット単位のNOT
bnot32(x) ビット演算 32ビットのビット単位のNOT
bnot64(x) ビット演算 64ビットのビット単位のNOT
plz(x) 出力制御 0より大きく1未満の数に先行ゼロを追加
plznl(x) 出力制御 0より大きく1未満の数に先行ゼロを追加(改行付き)
pnlz(x) 出力制御 0より大きく1未満の数の先行ゼロを削除
pnlznl(x) 出力制御 0より大きく1未満の数の先行ゼロを削除(改行付き)
ubytes(x) データ型 符号なし整数のバイト数を返す
sbytes(x) データ型 符号付き整数のバイト数を返す
s2u(x) データ型 符号付き整数を符号なし整数に変換
s2un(x, n) データ型 符号付き整数を符号なし整数に変換(nバイト)
bc -l
pi(10)  # 3.1415926535

スクリプトの実行

編集

ファイルからの実行

編集

スクリプトをファイルに保存して実行できます。

script.bc
# script.bc
x = 5
y = 10
x + y
bc script.bc  # 15

対話モードと非対話モード

編集

bcは、対話モードと非対話モードの両方で使用できます。

  • 対話モード: ターミナルで直接計算を行う
  • 非対話モード: ファイルやコマンドラインからスクリプトを実行する

環境変数と設定

編集

環境変数の影響

編集

bcの動作は、以下の環境変数で制御できます。

環境変数
環境変数 説明
BC_ENV_ARGS コマンドライン引数を事前に設定
BC_LINE_LENGTH 出力行の長さを設定
BC_BANNER バナーの表示を制御
export BC_ENV_ARGS="-l"
bc
e(1)  # 2.71828182845904523536

応用例

編集

複雑な計算の例

編集
円周率の計算
bc -l
define pi() {
    return 4 * a(1)
}
pi()  # 3.14159265358979323844

スクリプトの例

編集
複数の計算を行うスクリプト
calc.bc
# calc.bc
define add(x, y) {
    return x + y
}
define sub(x, y) {
    return x - y
}
add(5, 3)  # 8
sub(10, 4)  # 6
bc calc.bc
8
6

おわりに

編集

このハンドブックでは、bcの基本的な使い方から高度な機能までを解説しました。bcはシンプルながらも強力なツールであり、数学的な計算やスクリプトの実行に広く利用されています。ぜひこのハンドブックを参考にして、bcを活用してください。