コンピューティングにおいて、Microsoft Binary Format ( MBF ) は浮動小数点数のフォーマットであり、バージョン 4.00 より前のMicrosoftのBASIC言語(MBASIC、GW-BASIC、QuickBASICを含む) で使用されていました。 [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ]
このフォーマットには主に2つのバージョンがあります。オリジナルのバージョンはメモリ容量が限られたシステム向けに設計されており、23ビットの仮数部、1ビットの符号部、8ビットの指数部 からなる32ビット(4 バイト)の数値を格納していました。拡張版(12k)BASICでは、 64ビットの倍精度型が追加されました。
Intel 8080プラットフォームからMOS 6502プロセッサに移植されていた時期には、コンピュータは標準機能としてより多くのメモリを搭載して出荷され始めていました。このバージョンは、オリジナルの 32 ビット形式、またはオプションの拡張 40 ビット (5 バイト) 形式で提供されました。40 ビット形式は、1970 年代と 1980 年代のほとんどの家庭用コンピュータで使用されていました。これら 2 つのバージョンは、それぞれ「6 桁」と「9 桁」と呼ばれることもあります。[ 8 ]
x86プロセッサを搭載したPCでは、 QuickBASICはバージョン4より前に、64ビット(8バイト)フォーマットで55ビットの仮数部を使用する倍精度フォーマットを再導入しました。MBFは、数年前に導入された標準のIEEE 754フォーマットを使用するQuickBASIC 4への移行時に廃止されました。
ビル・ゲイツとポール・アレンは1975年にAltair BASICの開発に取り組んでいました。彼らはハーバード大学でDEC PDP-10上でAltairエミュレータを実行してソフトウェアを開発していました。[ 9 ]彼らに欠けていたのは、非常に大きな数や非常に小さな数での計算をサポートするために必要な浮動小数点数を扱うコードでした。[ 9 ]これは特に科学や工学に役立つものでした。[ 10 ] [ 11 ] Altairの提案された用途の1つは、科学計算機としてでした。[ 12 ]

ハーバード大学の学部生寮であるカリアー・ハウスでの夕食の席で、ゲイツとアレンは夕食の同席者にこのコードを書かなければならないと不満を漏らした[ 9 ]。すると同席者の1人、モンテ・ダビドフが、以前に浮動小数点ルーチンを書いたことがあると述べ、ゲイツとアレンに、自分ならAltair BASICの浮動小数点コードを書けると確信させた[ 9 ] 。当時、IBMは独自のプログラムを発表していたものの、浮動小数点数の標準は存在しなかったため、ダビドフは独自の標準を考案する必要があった。彼は32ビットで十分な範囲と精度が得られると判断した[ 13 ] 。アレンがMITSにそれを実演しなければならなかった時、それが実際のAltairで初めて実行された[ 14 ] 。しかし、それはうまくいき、彼が「PRINT 2+2」と入力すると、ダビドフの加算ルーチンは正しい答えを出した[ 9 ] 。
Altair BASIC のソースコードのコピーが 1999 年に再び発見された。1970 年代後半、ゲイツの元指導教官で学部長のハリー・ルイスが、エイデンのオフィスの家具の後ろでそれを見つけ、ファイル キャビネットに保管した。長い間その存在をほぼ忘れていたルイスは、最終的にロビーにリストを展示するというアイデアを思いついた。しかし、司書で保存修復家のジャニス・メリル=オールドハムがその重要性を指摘した後、オリジナルのリストを保存し、展示と保存のためにいくつかのコピーを作成することに決定した。[ 15 ] [ 16 ]ソースのコメントでは、Altair BASIC の数学パッケージの作者はダビドフであるとされている。[ 15 ] [ 16 ]
Altair BASIC は普及し、すぐに初期の家庭用コンピュータのほとんどが何らかの形の Microsoft BASIC を実行するようになりました。[ 17 ] [ 18 ] Commodore PETなどで使用された6502 CPU用の BASIC ポートは、6502 のコード密度が低いため、より多くのスペースを占有しました。そのため、マシン固有の入力および出力コードとともに単一の ROM チップに収まる可能性は低いものでした。追加のチップが必要だったため、追加のスペースが利用可能になり、これは浮動小数点形式を 32 ビットから 40 ビットに拡張するために部分的に使用されました。[ 8 ]この拡張形式はCommodore BASIC 1 および 2 によって提供されただけでなく、バージョン 1.1 (1977 年) 以降のApplesoft BASIC I および II、バージョン 1.1a (1977 年) 以降のKIM-1 BASIC、およびバージョン 2b (1980 年) 以降のMicroTAN BASICでもサポートされました。[ 8 ]その後間もなく、TRS-80用のLevel II BASIC (1978 年)などのZ80移植版では、32 ビット単精度とは別のデータ型として 64 ビット倍精度形式が導入されました。[ 19 ] [ 20 ] [ 21 ] Microsoft はFortran [ 22 ]の実装やマクロアセンブラMASM [ 23 ]で同じ浮動小数点形式を使用しましたが、スプレッドシートMultiplan [ 24 ] [ 25 ]やCOBOL実装では二進化十進数(BCD) 浮動小数点を使用しました。[ 26 ]それでもしばらくの間、MBF は家庭用コンピュータの事実上の浮動小数点形式となり、今でも時折、それを使用する古いファイルやファイル形式に出くわすことがあります。[ 27 ] [ 28 ] [ 29 ] [ 30 ] [ 31 ] [ 32 ]

並行して、インテルは1976 年に浮動小数点コプロセッサの開発を開始した。 [ 33 ] [ 34 ]インテルのコンサルタントであるウィリアム・モートン・カーンは、インテルがデジタル・イクイップメント・コーポレーション(DEC) の VAX の浮動小数点を使用することを提案した。最初の VAX、VAX-11/780 は1977 年後半に発売されたばかりで、その浮動小数点は非常に高く評価されていた。VAX の浮動小数点フォーマットは、最上位ビットに符号があるという点を除いて MBF と異なっていた。[ 35 ] [ 36 ]しかし、チップをできるだけ広い市場に売り込もうとしていたため、カーンは仕様書の作成を依頼された。[ 33 ]インテルの新しいチップの噂が競合他社に伝わると、インテルが優位に立ちすぎるのを防ぐために、IEEE 754と呼ばれる標準化の取り組みを開始した。 8 ビットの指数部は、倍精度数に必要な演算(たとえば、2 つの 32 ビット数の積を格納する場合)には十分な幅ではなかったため、[ 1 ] Intel の提案と DEC の対案では、1965 年のCDC 6600の実績のある60 ビット浮動小数点形式と同様に 11 ビットが使用されました。 [ 34 ] [ 37 ] [ 38 ] Kahan の提案では、ゼロ除算条件を扱う際に役立つ無限大、無効な演算を扱う際に役立つ非数、アンダーフローによって引き起こされる問題を軽減するのに役立つ非正規化数、 [ 37 ] [ 39 ] [ 40 ]および数値の逆数を取る際にオーバーフローとアンダーフローを回避するのに役立つ、よりバランスの取れた指数部バイアスも提供されました。[ 41 ] [ 42 ]
QuickBASIC 4.00がリリースされる頃には、 IEEE 754 規格は広く採用されていました。例えば、Intel の387コプロセッサや、486以降のすべてのx86プロセッサに組み込まれていました。QuickBASIC バージョン 4.0 と 4.5 はデフォルトで IEEE 754 浮動小数点変数を使用しますが、(少なくともバージョン 4.5 では) IDE とコンパイラに/MBFというコマンドライン オプションがあり、これにより IEEE 浮動小数点数から MBF 浮動小数点数に切り替わり、MBF データ形式の詳細に依存する以前のプログラムをサポートできます。Visual Basicも MBF の代わりに IEEE 754 形式を使用します。
MBF の数値は、8 ビットの 2進指数、符号ビット(正の仮数部: s = 0、負の仮数部: s = 1)、および仮数部の 23 ビット、 [ 43 ] [ 8 ] 31ビット[ 8 ]または 55 ビット[ 43 ]の仮数部で構成されます。明示的な仮数部の左側には常に 1 ビットが暗黙的に存在し、基数点はこの暗黙のビットの前に位置します。指数は128のバイアスでエンコードされるため、指数−127…−1はx = 1…127 (01h…7Fh)で表され、指数0…127はx = 128…255 (80h…FFh)で表され、 x = 0 (00h) は整数がゼロであることを表す特別なケースです。
MBF倍精度フォーマットはIEEE 754フォーマットよりもスケーラビリティが低く、フォーマット自体はほぼ1桁の精度向上を実現しているものの、実際にはIEEEの計算では80ビットの中間結果を使用するのに対し、MBFでは使用しないため、格納される値の精度は低くなります。[ 1 ] [ 3 ] [ 43 ] [ 44 ] IEEE浮動小数点とは異なり、MBFは非正規化数、無限大、NaNをサポートしていません。[ 45 ]
MBF単精度フォーマット(32ビット、「6桁BASIC」):[ 43 ] [ 8 ]
MBF拡張精度フォーマット(40ビット、「9桁BASIC」):[ 8 ]
{{cite book}}:|website=無視されました (ヘルプ){{cite book}}:|website=無視されました (ヘルプ){{cite book}}:|website=無視されました (ヘルプ)[…] この文書は、最近までEquis社のMetaStockチャート作成ソフトウェアで積極的に使用されていた、廃止されたCompuTracデータフォーマットについて説明しています。[…]
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)[…] _fmsbintoieee(float *src4, float *dest4) […] MS バイナリ形式 […] バイト順序 => m3 | m2 | m1 |指数 […] m1 は
最上位バイト
=> sbbb|bbbb […] m3 は
最下位バイト
[…] m = 仮数バイト […] s = 符号ビット […] b = ビット […] MBF はバイアス 128、IEEE はバイアス 127 です。 […] MBF は
想定ビット
の前に
小数点
を配置しますが、IEEE は想定ビットの後に小数点を配置します。 […] ieee_exp = msbin[3] - 2; /* 実際には、msbin[3]-1-128+127 */ […] _dmsbintoieee(double *src8, double *dest8) […] MS バイナリ形式 […] バイト順序 => m7 | m6 | m5 | m4 | m3 | m2 | m1 |指数 […] m1 は最上位バイト => smmm|mmmm […] m7 は最下位バイト […] MBF はバイアス 128、IEEE はバイアス 1023 です。 […] MBF は想定されるビットの前に小数点を配置し、IEEE は想定されるビットの後に小数点を配置します。 […] ieee_exp = msbin[7] - 128 - 1 + 1023; […]
[…] IEEE 754 シングルフォーマット […] 指数は127 で
バイアスされています。
基数点
の前に 1 ビット
があると
想定されて
います(したがって、仮
数
は 1.ffff… で、f は小数ビットです
)
[…] Microsoft バイナリフォーマット (単精度) […] 指数は 128 でバイアスされています。基数点の後に 1 ビットがあると想定されています (したがって、仮数は 0.1ffff… で、f は小数ビットです) […] IEEE の仮数は MBF の仮数の 2 倍です。 […] MBFからIEEEシングルに変換するには […] 指数から2を減算し(バイアス変更用と仮数係数用)、符号と指数のビットを並べ替えます。小数部分は変わりません。IEEEシングルからMBFに変換するには […] 指数に2を加算し(バイアス変更用と仮数係数用)、符号と指数のビットを並べ替えます。小数部分は変わりません。 […]