関数binary2double マニュアル

(The documentation of function binary2double.h)

Last update: 2021/11/30


◆機能・用途(Purpose)

64ビット分のバイナリデータを IEEE754規格に沿って与えられた倍精度浮動小数点数と見なして 対応するdouble型変数に変換する。
Convert a 64-bit-long binary data to the corresponding double-type variable, assuming that the binary data represents a double precision floating-point number given based on the IEEE754 standard.


◆形式(Format)

#include <doublemath.h>
inline double binary2double(const unsigned char ∗data)


◆引数(Arguments)

data 変換したいバイナリ列を前から順に8ビットずつ格納した配列。
An array composed of the binary data to convert.


◆戻り値(Return value)

変換後の実数値。
The real number obtained by the conversion.


◆使用例(Example)

unsigned char data[8];
fread(data,1,8,fp);
double value=binary2double(data);


◆使用上の注意(Note)

この関数ではエンディアンオーダーを反転させる機能は無いので 必要であれば事前に行うこと。
This function does not support an endian-order conversion so that the conversion, if necessary, should be done before calling this function.


◆補足(Description)

IEEE754の規格自体は有料のため入手できていないが、 日本語のWikipedia に詳細な解説がある。 上記解説はmatlabの公式マニュアルにおける説明 とも整合的になっているのでこれを信じることにすると、以下のように理解できる。
Because the IEEE754 standard is not free, the programmer of this function did not obtain the standard yet. However, a detailed description of the standard is available from Japanese Wikipedia. Since the description in the Wikipedia is consistent with the official documentation of MATLAB, the programmer believed the description and understood as follows.

まずはじめに実数値の2進数表現を理解しなければならない。 実数のうちの整数部分については普通に2進数で表現する。 小数部分については0.5の位、0.25の位、0.125の位、…、と順に表現する。 このようにすると例えば118.625は2進数で1110110.101と表現できる。 念のため小数部分の「101」の意味を補足すると、 \(\myvector{1}\times 0.5+\myvector{0}\times 0.25+\myvector{1}\times 0.125\) という意味である。
First of all, one has to understand the binary digit expression for a real number. The integer part of a real number is expressed as the ordinary binary digits. The binary digits for the decimal part represents the values for the 0.5's place, 0.25's place, 0.125's place, …. For example, 118.625 can be expressed in the binary digits as 1110110.101, where the “101” in the decimal part represents \(\myvector{1}\times 0.5+\myvector{0}\times 0.25+\myvector{1}\times 0.125\).

このようにして表現した2進数を今度は 「\(\pm 1.∗\times 2^{∗}\)」の形に書き換える。 上の例であれば\(1.110110101\times 2^{6}\)となる。 任意の2進数は「\(\pm 1.∗\times 2^{∗}\)」 の形に書き換えることができる。
Now, let us modify the expression of the binary digits into the form “\(\pm 1.∗\times 2^{∗}\)”; the example above can be expressed as \(1.110110101\times 2^{6}\). Note that any real numbers expressed by the binary digits can be expressed by the form “\(\pm 1.∗\times 2^{∗}\)”.

なお、10進数の場合に1.234と1.2340000000000が同じなのと同様で、 2進数の場合にも\(1.110110101\times 2^{6}\)は 1.11011010100000000000(0はいくつ続いても良い)\(\times 2^{6}\) と同じである。以下のビットの割り当てにおいてはこの考え方を用いる。
Just the same as the fact that 1.234 is equal to 1.2340000000000 in case of the decimal digits, 1.110110101\(\times 2^{6}\) in the binary digits is equal to 1.11011010100000000000 (arbitrary number of zeroes) \(\times 2^{6}\). This aspect is used in the binary expression of a real number below.

IEEE754規格では上のように表現した2進数に対して以下のようにビットを割り当てる。
In the IEEE754 standard, a real number is expressed as the form of “\(\pm 1.∗\times 2^{∗}\)” as described above, which is further expressed as a bit sequence as follows.
ビット
Bits
中身
Content
\(118.625=1.110110101\times {2^{6}}_{(2)}\)の場合の例
Example for \(118.625=1.110110101\times {2^{6}}_{(2)}\)
先頭の1ビット
The first 1 bit
符号(0=正、1=負)
Sign (0=positive, 1=negative)
0
先頭から2-12ビット目
From 2nd to 12th bits
指数部に1023を加えた値(1-2046)の2進数表現
The binary digits for the exponent added by 1023 (1-2046)
6+1023=1029を2進数で表した値
The binary digits for 6+1023=1029
先頭から13-64ビット目
From the 13th to 64th bits
仮数部の小数部分
The decimal part of the mantissa
110110101000000…(64ビット目まで全部0で埋める)
110110101000000… (zeroes padded until reaching the 64th bit)

なお、指数部に1023を加えた値が0または2047のときは以下のような特別な意味を持つ。
If the exponent added by 1023 is either 0 or 2047, the bit sequence has the following special meanings.
指数部に1023を加えた値
The exponent added by 1023
仮数部
The mantissa
意味
Meaning
0 任意
Arbitrary
\(\pm 0.∗\times 2^{-1022}\) (仮数部が1.∗ではなく0.∗になっていること、 指数部が\(-1023\)ではなく\(-1022\)になっていることに注意)
\(\pm 0.∗\times 2^{-1022}\) (Note that the mantissa is not 1.∗ but 0.∗ and the exponent is not \(-1023\) but \(-1022\).
2047 0
2047 0以外(任意)
Other than zero (arbitrary)
NaN