プログラムは楽しげに走らねばならない♪
 
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 最初次のページへ >>

近々,C言語ソースコード・ライブラリの販売を開始します.

今までに自作したC言語ライブラリを整理・機能追加して,ソースコードを格安で販売しようと思います.当面はこのサイトへのアクセス数が多いテーマの中から,次のようなソースライブラリを順次発売しようと考えています.

ライセンスについてはごく緩く,(特に業務での) 使用にほとんど制限なしにする予定です.原則として,

  • 非商用の場合:購入者以外にソース開示禁止.
  • 商用の場合:関係者 (開発者,納品先) 以外にソース開示禁止.

それ以外はどう使おうが自由.


グレゴリオ暦・ユリウス暦・通算日数計算ライブラリ 」は,今月中に販売開始する予定です.

(予価:\2,000(非商用),\5,000(商用))

象の卵,始めました.

なんか以前から時々,象の卵探しに来る人 がいる.
ありもしないものをいつまでも探すの(´・ω・)カワイソス….

というわけで,「象の卵 」コーナーを開設しました.

  • 象の卵 その1:構造体のメンバ数の取得方法? (以前書いた記事を微修正)
  • 象の卵 その2:構造体/共用体のエンディアン? (新規追加)

3次元の回転 (原点を通る任意方向回転軸,座標系に依存しないベクトル・回転行列表現)

3次元の回転 (原点を通る任意方向回転軸,座標系に依存しないベクトル・回転行列表現) 」のページを追加しました.座標系に依存しないベクトル表現と,回転行列について書いています.四元数 (クォータニオン) 表現については研究中.


なお,この行列を同次座標用に拡張したものは,OpenGLglRotate (glRotatef, glRotatex) 関数でも用いられています.


http://www5d.biglobe.ne.jp/~noocyte/Programming/Geometry/3DRotation.html

共用体の全メンバのオフセットが0である理由

↑について質問を受けたので,「データ型のアラインメントとは何か,なぜ必要なのか? 」のページに回答を追記しました.


共用体の全メンバのオフセットが0である理由
http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html#UnionMemberOffset

NIXU エンディアン発見!

昨日ある動画ファイルのフォーマットを調べていたら,その中の1つのフィールドが事実上 NIXUエンディアンになっていたのでびっくりした.まさかこんなエンディアンが実在しているとは思わなかった.


続き

世界標準時 (UTC,UT1,TAI,GMT など) の間の関係

世界標準時については,地球の自転速度に始まり,協定世界時 (UTC) やら,国際原子時 (TAI),閏秒などがあって関係がよくわからなかったし,グリニッジ標準時 (GMT) は廃れたらしいとか,いろいろ知識があいまいだった.そこで Wikipedia で調べてこれらの関係を整理し, にしてみた.間違いを見つけた方はご一報ください.


http://www5d.biglobe.ne.jp/~noocyte/Programming/GregorianAndJulianCalendars.html#UniversalTime

グレゴリオ暦/ユリウス暦 ⇔ 通算日数変換アルゴリズム

グレゴリオ暦/ユリウス暦 ⇔ ユリウス日 (または一般の通算日数) 変換アルゴリズム 」に,「通日 ⇒ 日付変換アルゴリズム 」の説明を追加しました.「日付 ⇒ 通日変換アルゴリズム 」の説明は既に掲載済なので,これでようやくドキュメント化完了.(アルゴリズム考案から18年も経ってようやく… orz)


また,時々「Excel UNIX time 変換」などで検索してくる人がいるので,「Excel による UNIX Time (time_t) ⇒ 日付のシリアル値変換 」も追加しました.


2つのN次元ベクトルのなす角 (回転角) と回転方向を求める公式 (N=2,3,…)

「ベクトル なす角」や「3次元 回転」などで検索して来る人が多いので,「3点の座標から簡単に回転方向を判別する.(2次元,外積を用いる方法) 」に,次の公式を追加しました.

  • なす角だけを求める.(N次元,回転方向の情報なし)
  • 角度+回転方向を求める.(2次元) … 更新
  • 角度+回転方向を求める.(3次元)
  • 角度+回転方向を求める.(N次元)

ただしN次元の回転方向については眉唾注意! (笑)


しかし回転方向はともかく,なす角だけなら高校で内積と一緒に習うと思うんだが….
なぜ検索数が多いんだろう?

なぜ今時のコンピュータのビット数 (語長) は2の冪乗なのか?

最近メチャ忙しいので,ブログを更新する暇がない.ホームページの方はわずかずつ更新していて,区切りのいいところでこちらでアナウンスしようと思っているのだが,なかなか区切りのいい時が来ない.orz


ところで今日,OKWave で上記タイトルに近い質問 があったので,面白いと思って回答を書いて投稿しようとしたらちょっと前に締め切られていた.○| ̄|_


せっかく書いたのだから少し文面を修正してここで公開することにする.上記の質問に対する回答として書いたので,プログラマでない一般ユーザにもだいたいわかると思う.


最近普及しているコンピュータ (CPU) は8ビット,16ビット,32ビット,64ビット,128ビットなど,一度に処理できるビット数 (語 (ワード) の長さ) が2の冪乗 (べきじょう) になっている.「なぜ今時の CPU のビット数 (語長) は2の冪乗なのか?」と聞かれて,「コンピュータは2進数を使用するから2の冪乗がキリがいい」というところまでは誰でも思い浮かぶだろうが,「語長が2の冪乗でキリがいい」と具体的にどう都合がいいのか,ちゃんと理解している人はどのくらいいるのだろうか? 上記の質問 に対する回答を見ても,質問の核心に答えている人はいない.私も今までちゃんと考えたことがなかったので,今回考えてみた.

質問タイトル:何で今時のコンピューターは8の倍数が基本なのか

『コンピュータで16進法を使うのは集積回路に乗っている石 (メモリ?)の分子構造が8を規準にしていて、
8の倍数である16進法を使うと都合が良いからだ』

みたいな事を昔聞いた記憶があるのですが、それらしい記事を検索しても見あたりません。

要は何で今時のコンピューターは8の倍数が基本なのか?
それは素材の物理的性質に基づいた物なのか?

まず「8の倍数」というのは正確ではなくて,「2の冪乗かつ8の倍数 (8,16,32,64,…)」が正しい.「8の倍数」だけだと24ビット CPU とか,40ビット CPU とかもアリになってしまう(昔は24ビット CPU もあったような気がするが…).


で,そうなっている理由はコンピュータや石 (半導体)の物理・化学的な性質とは全く無関係なので,

『コンピュータで16進法を使うのは集積回路に乗っている石 (メモリ?)の分子構造が8を規準にしていて、
8の倍数である16進法を使うと都合が良いからだ』みたいな事を昔聞いた記憶がある

という伝聞がこのとおりならば,半導体のことも,コンピュータのことも知らない素人が知ったかぶりで言ったことに間違いない.(つまり全くデタラメなトンデモ説.)


余談:さらに追い討ちをかけると(笑),「8の倍数である16進法」というのもおかしい.「(8の倍数) 進法」が都合がいいということであれば,24進法,40進法などもOK ということになるが,これらは2進法とは全く親和性がない.

ワードマシン

昔は「8の倍数でない」ビット数を1語 (ワード) にしたコンピュータ(12ビットマシン,36ビットマシンなど) も普通に存在していた.こういうマシンを「ワードマシン 」という.例えば1ワード=12ビットのマシンは,メモリを一度に12ビット読み書きする.


ワードマシンは今でも少し残っているらしい.例えば ACOS-6 (NEC 製メインフレーム) は36ビットのワードマシンである.


余談:上記のACOS-6 のページに「1バイト=ビット」と書いてある点に注意.ほとんどの場合「1バイト=8ビット」なので1バイトは必ず8ビットだと思っている人も多いと思うが,1バイト が8ビット以外の場合もある.
(だから通信の分野では,8ビットを「バイト」とは呼ばずに「オクテット 」という.)

キャラクタマシン

昔のコンピュータに「6の倍数」(12,36など) を語長とするものが多かった理由は,初期に使われた文字コード (EBCDIC またはその原型? 各メーカが独自に拡張して今でも使われているらしい)が6ビット (英大文字+数字+若干の記号,小文字は使えない) だったことに由来する.例えば36ビットマシンならば,1語に丁度6文字入る (6ビット×6文字=36ビット).


このように,6ビット文字 (キャラクタ) 単位でデータを扱うマシンを「キャラクタマシン 」ともいう.

なぜ「計算機」なのに「文字 (キャラクタ)」が重要だったのかというと,事務処理の分野では純粋な2進法ではなく10進法で計算しなければならない場合が多いためらしい(この分野で仕事をしたことがないので伝聞形).


計算速度という点では,純2進数で計算する方が単純かつ高速なので,科学技術計算分野ではそうする.しかし純2進数 ⇔ 10進数の変換をしようとすると,小数の場合に誤差が出ることがある (10進小数は2進小数で正確に表現できない場合がある).これは特に金額を計算する場合にはまずいので,事務計算では10進数の文字列に近い形式 (BCD ) を使い,純2進数ではなく10進数で計算するのが普通らしい.だからキャラクタマシンがヒットしたのだろう.


その後標準的な文字コードとしてASCII が普及したが,これは7ビットなので,従来の6ビット系キャラクタマシンでは効率良く扱えない.


また余談:世界初のマイクロコンピュータ (マイコン) は4ビットのIntel 4004 (1971年) だった.これは電卓用として開発されたので,10進数を文字列として表現するのではなく,10進数の各桁を4ビットの2進数として扱うことを想定していたはず.それ以上ビット数を増やすと回路規模が大きくなり,当時の集積回路技術ではコストがかかりすぎるので4ビットにしたのだろう.

ようやく本題:CPU の語長が2の冪乗だと,具体的に何が都合がいいのか?

私の (プログラマとしての) 経験から具体的なメリットを挙げてみる.
(実際にそういう語長が出現 ~普及した経緯についてはコンピュータ史を色々調べてみる必要がある.昔からそうしたいと思っているのだが….)

  1. なぜ8ビットの倍数でなければならないか?

    標準的な文字コードとして ASCII (7ビット) が普及した. その後制定された各国のさまざまな文字コードも最低7ビットが必要で, 普通は8ビットを単位としている. したがって1バイト=8ビット単位でデータを処理するマシン (バイトマシン ) でないと,文字情報を効率良く扱えない.

  2. なぜ語長が2の冪乗でなければならないか?

    プログラムを書いていると,あるサイズ (ビット数またはバイト数) のデータを記憶するのにメモリが何語 (または何バイト) 必要か, といった計算をしなければならないことがしょっちゅうある (プログラマが意識していなくて,コンパイラがやっている場合も多い). これを次のようなたとえ話で考えてみよう.

    「N個の同種の品物 (ビット) がある.1つの箱 (語またはバイト) にはM個の品物が入れられる.いくつの箱が必要か?」

    例えばN=789個の品物があったとして,1箱にM=12個入るとすれば, N÷M=65あまり9なので66箱必要ということになる. しかし割り算を筆算でするのは手間がかかる. (コンピュータは自分で計算しなければならないので, このたとえ話で「電卓を使う」というのはナシ.)

    人間は10進数で計算するので,Mが10の冪乗 (10,100,1000,…) だったらわざわざ筆算しなくても, 小数点の位置をずらすだけで簡単に答えが出る.

    コンピュータは10進数ではなく2進数を使うので, 語という「箱」やバイトという「小箱」の大きさが2の冪乗ならば, わざわざ時間のかかる割り算をしなくても,(小数点の代わりに) ビットの位置をずらす (シフト) だけですぐに答えが出るので,処理が高速に行える. プログラムの中ではこういう計算を頻繁に行うので, 語やバイトが2の冪乗でないと,処理が非常に遅くなる場合がある.

    (最近のパソコンに使われている CPU は,乗除算を高速に行う回路を持っている. しかし家電製品などに組み込まれている CPU は,低価格化, 低消費電力化などのためにそういう回路は付いていないことが多いので, 乗除算には時間がかかる.)

双方向線型リスト処理マクロ集 (C言語用) / ホームページ更新情報

「C/C++ 関数・マクロ集」に,「双方向線型リスト処理マクロ集 」(サンプルプログラム付) を追加しました.

●データ構造

┏━━━┯━┓
┃last  │・╂─────────────────────┐
┠───┼─┨      ┏━━━━┯━┓    ┏━━━━┯━┓│  ┏━━━━┯━┓
┃first │・╂──→┨forward │・╂─→┨forward │・╂┴→┨forward │/┃
┗━━━┷━┛      ┠─┬──┴─┨    ┠─┬──┴─┨    ┠─┬──┴─┨
 リストヘッダ       ┃/│backward┠←─╂・│backward┠←─╂・│backward┃
                    ┗━┷━━━━┛    ┗━┷━━━━┛    ┗━┷━━━━┛
                         要素 #1             要素 #2             要素 #N
  • リストの要素となる構造体や, そのメモリ確保方法はアプリケーションで自由に定義・選択可能.
  • 同一のリスト要素構造体を複数のリストが共有可能.

前回 (5月13日) 以後の主なホームページ更新情報

1 | 2 | 3 | 4 | 最初次のページへ >>