CDF
Internal
Format
Description
Version
2.6, December 18, 1997
National
Space Science Data Center
Copyright ã 2002 NASA/GSFC/NSSDC
National Space Science
Data Center
NASA/Goddard Space Flight
Center
Greenbelt, Maryland 20771
(U.S.A.)
This
software may be copied or redistributed as long as it is not sold for profit,
but it can be incorporated into any other substantive product with or without
modifications for profit or non-profit.
If the software is modified, it must include the following notices:
- The software is not the original (for protection of the original
author’s reputations from any problems introduced by others)
- Change history (e.g.
date, functionality, etc.)
This
copyright notice must be reproduced on each copy made. This software is
provided as is without any express or implied warranties whatsoever.
DECnet -
NSSDCA::CDFSUPPORT
Internet -
gsfc-cdf-support@lists.nasa.gov
Contents
Preface.................................................................................................................................................................................................. 1
Chapter 1
Introduction......................................................................................................................................................................................... 3
Chapter 2
dotCDF File.......................................................................................................................................................................................... 5
2.1 Magic Numbers............................................................................................................................................................ 9
2.2 CDF Descriptor Record............................................................................................................................................... 9
2.3. GLOBAL DESCRIPTOR RECORD............................................................................................................................. 11
2.4 Attribute Descriptor Record....................................................................................................................................... 13
2.5 Attribute Entry Descriptor Record............................................................................................................................ 15
2.6 Variable Descriptor Record......................................................................................................................................... 17
2.7 Variable Index Record.................................................................................................................................................. 19
2.8 Variable Values Record................................................................................................................................................ 21
2.9 Compressed CDF Record............................................................................................................................................ 22
2.10 Compressed Parameters Record................................................................................................................................. 22
2.11 Sparseness Paramters Record.................................................................................................................................... 23
2.12 Compressed Variable Values Record......................................................................................................................... 24
2.13 Unused Internal Record.............................................................................................................................................. 25
Chapter 3
Variable Files....................................................................................................................................................................................... 27
Chapter 4
Variable Records................................................................................................................................................................................. 29
Chapter 5.............................................................................................................................................................................................. 33
Encodings............................................................................................................................................................................................ 33
5.1 Data Representations................................................................................................................................................... 33
5.1.1 Bits.......................................................................................................................................................................... 33
5.1.2 Bytes....................................................................................................................................................................... 33
5.1.3 Integers.................................................................................................................................................................. 33
5.1.4 Floating-Point........................................................................................................................................................ 34
5.2 Control Information....................................................................................................................................................... 37
5.2.1 Integer Values....................................................................................................................................................... 37
5.2.2 Character Strings.................................................................................................................................................. 37
5.3 Application Data........................................................................................................................................................... 37
Appendix A......................................................................................................................................................................................... 41
Single-Precision Floating-Point........................................................................................................................................................ 41
Appendix B.......................................................................................................................................................................................... 45
This document
will present the physical file layout used by the Common Data Format (CDF) for
CDF Version 2.7. No attempt will be
made to teach the concepts of CDF. For that please refer to the CDF User's
Guide, CDF C Reference Manual, and CDF Fortran Reference Manual. This document will assume that you are
familiar with rVariables, zVariables, attributes, gEntries, rEntries, zEntries,
and all of the other CDF concepts.
Using the contents of this document you should be able to rewrite the
CDF library in your spare time.
A CDF may
have one of two formats: single-file or multi-file. A single-file CDF contains everything in one file having an
extension of .cdf. A multi-file CDF
stores everything except variable values in one file (with an extension of
.cdf). The variable values are stored
in separate files - one per variable.
Variable files are described in Chapter 3. The .cdf file of a CDF will be referred to as the dotCDF file
throughout this document.
The dotCDF
file of a CDF contains magic numbers and numerous internal records are used to
organize information about the contents of the CDF (for both single-file and
multi-file CDFs). Chapter 2 describes
the magic numbers and the various internal records. The data encodings used by CDF are described in Chapter 5. The file attributes of a dotCDF or variable
file are not an issue on UNIX-based systems, the PC, or the Macintosh[1]
because all files on those platforms are simply treated as a sequence of bytes. On OpenVMS-based systems, however, file
attributes are very much an issue. The
file attributes of a dotCDF or variable file created by the CDF library on an
OpenVMS-based system are as follows:
File
organization: Sequential
Record
format: Fixed length 512 byte
records
Record
attributes: None
RMS
attributes: None
These are
also the file attributes for a file which has been FTPed to an OpenVMS-based
system in binary mode. With these file
attributes the CDF library is able to read the file as if it simply consisted
of a sequence of bytes. Transferring a
CDF file to an OpenVMS-based systems as a text file will result in a different
set of file attributes as well as the insertion of additional bytes into the
file (because the file system thinks there are suppose to be lines of
text). CDF files transferred in this
way will not be readable by the CDF library.
CDFs created
while running the POSIX Shell on a DEC Alpha (running OpenVMS), however, will
have a different set of file attributes when the POSIX Shell is not being
used. These file attributes are:
File
organization: Sequential
Record
format: Stream LF, maximum
32767 bytes
Record
attributes: Carriage return
carriage control
RMS
attributes: None
A CDF file
with these attributes appears to be readable by the CDF library on current
versions of OpenVMS for a DEC Alpha.
Some older version of OpenVMS apparently treat these file attributes
differently and may cause a problem for the CDF library.
This chapter
will describe the contents of the dotCDF file.
The dotCDF file contains a magic number and two or more internal records
(IRs) that are used to organize the contents of a CDF. Different types of
internal records are used to store information about various aspects and/or objects
in the CDF. Each internal record contains two or more fields. The first field (at internal record offset[2] 0x0), referred to as the RecordSize field,
is a 4-byte unsigned integer containing the size of the internal record in
bytes. The second field (at internal
record offset 0x4), referred to as the RecordType field, is a 4-byte signed
integer containing the type of internal record. Fields from the third through the last depend on the type of
internal record. Each field is stored
contiguously, however, and some fields may not be present in a particular
instance of a type of internal record.
Note that internal record fields are also referred to as “internal
values.”
Table 2.1
lists the types of internal records, the associated RecordType values, and
brief descriptions. Detailed
descriptions are found in the corresponding sections.
All dotCDF
files contain a CDF Descriptor Record (CDR) and a Global Descriptor Record
(GDR). Other internal records will be
present depending on the contents of the CDF. The CDR is always at file offset[3] 0x00000008 which immediately follows the
magic number(s) described in Section 2.1.
The file offset of the GDR is stored in the CDR.
The only
internal record at a fixed location in the dotCDF file is the CDR. All other internal records (including the
GDR) may be present in any order (which generally depends on the order in which
the contents of the CDF were created by an application). File offsets are used to “point" to other
internal records. Linked lists of internal
records are implemented by storing the file offset of the first internal record
on the linked list, having that internal record store the file offset of the
next internal record on the linked list, and so on. Figure 2.1 shows a possible arrangement of internal records in a
"uncompressed" dotCDF file.
Note that the GDR “points" to the first zVDR that in turn
“points" to the next zVDR. File
offsets as described in the sections to follow are used to implement this
linked list. Keep in mind that this is
only an example of how a dotCDF file might be arranged. The internal records
shown could be ordered in a number of different ways depending on how the CDF
was written by the application. Figure
2.2 shows a possible arrangement of internal records in a dotCDF file which has
a variable compressed. Figure 2.3 shows
the file arrangement of internal records in a fully compressed dotCDF file.
|
Type of Internal Record |
RecordTypeField Internal Value |
Purpose/Contents |
|
CDR |
1 |
CDF Descriptor Record. General information about the CDF (see Section 2.2). |
|
GDR |
2 |
Global Descriptor Record. Additional general information about the CDF (see Section
2.3). |
|
rVDR |
3 |
rVariable Descriptor Record. Information about an rVariable (see Section 2.6). |
|
ADR |
4 |
Attribute Descriptor Record. Information about an attribute (see Section 2.4). |
|
AgrEDR |
5 |
Attribute g/rEntry Descriptor Record. Information about a gEntry or rEntry of an attribute (see
Section 2.5). |
|
VXR |
6 |
Variable Index Record. Indexing information for a variable (see Section 2.7). |
|
VVR |
7 |
Variable Values Record. One or more variable records (see Section 2.8). |
|
zVDR |
8 |
zVariable Descriptor Record. Information about a zVariable (see Section 2.6). |
|
AzEDR |
9 |
Attribute zEntry Descriptor Record. Information about a zEntry of an attribute (see Section
2.5). |
|
CCR |
10 |
Compressed CDF Record. Information about a compressed CDF/variable (see Section
2.9). |
|
CPR |
11 |
Compression Parameters Record. Information about the compression used for a CDF/variable
(see Section 2.10). |
|
SPR |
12 |
Sparseness Parameters Record. Information about the specified sparseness array (see
Section 2.11). |
|
CVVR |
13 |
Compressed Variable Values Record. Information for the compressed CDF/variable (see Section
2.12). |
|
UIR |
-1 |
Unused Internal Record. An internal record not currently being used (see Section
2.13). |
Table 2.1: Internal Records

Figure
2.1: Example of an Uncompressed dotCDF
File Arrangement

Figure
2.2: Example of a File Arrangement of a
dotCDF File with a Compressed Variable

Figure
2.3: Example of a File Arrangement of a
Fully Compressed dotCDF File
CDF Version
2.6 and 2.7 use two magic numbers.[4] The first one is 0xCDF26002[5]
at file offset 0x00000000 stored as a 4-byte, unsigned integer with big-endian
byte ordering. It is followed by the
second one, another 4-byte unsigned integer of 0x0000FFFF for a regular CDF
file[6]
or 0xCCCC0001 for a compressed CDF file[7]
at file offset 0x00000004. The first
internal record is stored at file offset 0x00000008.
All dotCDF
files contain a single CDF Descriptor Record (CDR) at file offset
0x00000008. The CDR contains general
information about the CDF (as does the GDR described in Section 2.3).
The CDR, as
shown in Figure 2.4, contains the following contiguous fields...
RecordSize Signed 4-byte integer,
big-endian byte ordering.
The size in bytes of this CDR (including
this field).
RecordType Signed 4-byte
integer, big-endian byte ordering.
The value 1 which identifies this as the
CDR.
GDRoffset Signed 4-byte integer,
big-endian byte ordering.
The file offset of the GDR. The GDR is
described in Section 2.3.
Version Signed 4-byte integer,
big-endian byte ordering.
The
version of the CDF distribution (library) that created this CDF. CDF distributions are identified with four
values: version, release, increment,
and sub-increment. For example, CDF
V2.5.8a is CDF version 2, release 5, increment 8, sub-increment ‘a’. Note that the sub-increment is not stored in
a CDF.
Release Signed 4-byte integer,
big-endian byte ordering.
The
release of the CDF distribution that created this CDF. See the Version field
above.
Encoding Signed 4-byte integer,
big-endian byte ordering.
The
data encoding for attribute entry and variable values. Section 5.3 describes the supported data
encodings and their corresponding internal values.
Flags Signed 4-byte
integer, big-endian byte ordering.
Boolean
flags, one per bit, describing some aspect of the CDF. Bit numbering is
described in Chapter 5. The meaning of
each bit is as follows...
0 The
majority of variable values within a variable record. Variable records are described in Chapter 4. Set indicates row-majority. Clear indicates
column-majority.
1 The
file format of the CDF. Set indicates
single-file. Clear indicates
multi-file.
2-31 Reserved
for future use. These bits are always
clear.
rfuA Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to zero (0).
rfuB Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to zero (0).
Increment Signed 4-byte integer,
big-endian byte ordering.
The
increment of the CDF distribution that created this CDF. See the Version field above. Prior to CDF V2.1 this field was always set
to zero (0).
rfuD Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
rfuE Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
Copyright Character string, ASCII
character set.
The
CDF copyright notice.[8] This consists of a string of characters
containing one or more lines of text with each line of text separated by a
newline character (0x0A). If the total number of characters in the copyright is
less than the size of this field, a NUL character (0x00) will be used to
terminate the string. In that case, the
characters beyond the NUL-terminator (up to the size of this field) are
undefined. This field may be one of two
sizes. Prior to CDF V2.5, this field
consisted of 1945 characters (bytes).[9] Since the release of CDF V2.5 this field has
been reduced to 256 characters (bytes).
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
GDRoffset |
4 bytes |
|
|
Version |
4 bytes |
|
|
Release |
4 bytes |
|
|
Encoding |
4 bytes |
|
|
Flags |
4 bytes |
|
|
rfuA |
4 bytes |
|
|
rfuB |
4 bytes |
|
|
Increment |
4 bytes |
|
|
rfuD |
4 bytes |
|
|
rfuE |
4 bytes |
|
|
Copyright |
variable |
1945 or 256 bytes in length depending on the CDF
distribution that created/modified the CDF. |
Figure 2.4: CDF Descriptor Record (CDR)
All dotCDF
files contain a single Global Descriptor Record (GDR) at the file offset
contained in the GDRoffset field of the CDR (described in Section 2.2). The GDR contains general information about
the CDF (as does the CDR).
The GDR,
shown in Figure 2.5, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this GDR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 2 which identifies this as the GDR.
rVDRhead Signed
4-byte integer, big-endian byte ordering.
The
file offset of the first rVariable Descriptor Record (rVDR). The first rVDR contains a file offset to the
next rVDR and so on. An rVDR will exist
for each rVariable in the CDF. This field will contain 0x00000000 if the CDF
contains no rVariables. Beginning with
CDF V2.1 the last rVDR will contain a file offset of 0x00000000 for the file
offset of the next rVDR (to indicate the end of the rVDRs). Prior to CDF V2.1 the “next VDR” file offset
in the last rVDR is undefined. rVDRs
are described in Section 2.6.
zVDRhead Signed
4-byte integer, big-endian byte ordering.
The
file offset of the first zVariable Descriptor Record (zVDR). The first zVDR
contains a file offset to the next zVDR and so on. A zVDR will exist for each zVariable in the CDF. Because
zVariables were not supported by CDF until CDF V2.2, prior to CDF V2.2 this
field is undefined. Beginning with CDF
V2.2 this field will contain either a file offset to the first zVDR or
0x00000000 if the CDF contains no zVariables.
The last zVDR will always contain 0x00000000 for the file offset of the
next zVDR (to indicate the end of the
zVDRs). zVDRs are described in Section
2.6.
ADRhead Signed
4-byte integer, big-endian byte ordering.
The
file offset of the first Attribute Descriptor Record (ADR). The first ADR contains a file offset to the
next ADR and so on. An ADR will exist
for each attribute in the CDF. This
field will contain 0x00000000 if the CDF contains no attributes. Beginning with CDF V2.1 the last ADR will
contain a file offset of 0x00000000 for the file offset of the next ADR (to
indicate the end of the ADRs). Prior to
CDF V2.1 the “next ADR" file offset in the last ADR is undefined. ADRs are described in Section 2.4.
eof Signed
4-byte integer, big-endian byte ordering.
The
end-of-file (EOF) position in the dotCDF file.
This is the file offset of the byte that is one beyond the last byte of
the last internal record. (This value
is also the total number of bytes used in the dotCDF file.) Prior to CDF V2.1, this field is undefined.
NrVars Signed
4-byte integer, big-endian byte ordering.
The
number of rVariables in the CDF. This will correspond to the number of rVDRs in
the dotCDF file.
NumAttr Signed
4-byte integer, big-endian byte ordering.
The
number of attributes in the CDF. This will correspond to the number of ADRs in
the dotCDF file.
rMaxRec Signed
4-byte integer, big-endian byte ordering.
The
maximum rVariable record number in the CDF.
Note that variable record numbers are numbered beginning with zero (0).
If no rVariable records exist, this value will be negative one (-1).
rNumDims Signed
4-byte integer, big-endian byte ordering.
The
number of dimensions for rVariables.
NzVars Signed
4-byte integer, big-endian byte ordering.
The
number of zVariables in the CDF. This will correspond to the number of zVDRs in
the dotCDF file. Prior to CDF V2.2 this
value will always be zero (0).
UIRhead Signed
4-byte integer, big-endian byte ordering.
The
file offset of the first Unused
Internal Record (UIR). The first UIR contains the file offset of
the next UIR and so on. The last UIR
contains a file offset of 0x00000000 for the file offset of the next UIR
(indicating the end of the UIRs).
Prior to CDF V2.5 this field will always contain a file offset of 0x00000000 (indicating no UIRs). Internal records that are unused may exist,
however, prior to CDF V2.5. They have
slightly different contents than UIRs and will be discussed in Section 2.13
along with actual UIRs.
rfuC Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Always set to zero (0).
rfuD Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
rfuE Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
rDimSizes Signed
4-byte integers, big-endian byte ordering within each.
Zero
or more contiguous rVariable dimension sizes depending on the value of the
rNumDims field described above.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
rVDRhead |
4 bytes |
|
|
zVDRhead |
4 bytes |
|
|
ADRhead |
4 bytes |
|
|
eof |
4 bytes |
|
|
NrVars |
4 bytes |
|
|
NumAttr |
4 bytes |
|
|
rMaxRec |
4 bytes |
|
|
rNumDims |
4 bytes |
|
|
NzVars |
4 bytes |
|
|
UIRhead |
4 bytes |
|
|
rfuC |
4 bytes |
|
|
rfuD |
4 bytes |
|
|
rfuE |
4 bytes |
|
|
rDimSizes |
variable |
Size depends on rNumDims field. If zero rVariable dimensions, this field will not be present. |
Figure 2.5: Global Descriptor Record (GDR)
2.4 Attribute Descriptor Record
An Attribute
Descriptor Record (ADR) contains a description of an attribute in a CDF. There
will be one ADR per attribute. The
ADRhead field of the GDR contains the file offset of the first ADR.
Each ADR, as
shown in Figure 2.6, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this ADR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 4 which identifies this as an ADR.
ADRnext Signed
4-byte integer, big-endian byte ordering.
The
file offset of the next ADR. Beginning with CDF V2.1 the last ADR will contain
a file offset of 0x00000000 in this field (to indicate the end of the
ADRs). Prior to CDF V2.1 this file
offset is undefined in the last ADR.
AgrEDRhead Signed 4-byte integer, big-endian byte ordering.
The
file offset of the ffrst Attribute g/rEntry Descriptor Record (AgrEDR) for this
attribute. The first AgrEDR contains a
file offset to the next AgrEDR and so on.
An AgrEDR will exist for each g/rEntry for this attribute. This field
will contain 0x00000000 if the attribute has no g/rEntries. Beginning with CDF V2.1 the last AgrEDR will
contain a file offset of 0x00000000 for the file offset of the next AgrEDR (to
indicate the end of the AgrEDRs). Prior
to CDF V2.1 the “next AgrEDR" file offset in the last AgrEDR is undefined.
Note
that the term g/rEntry is used to refer to an entry that may be either a gEntry
or an rEntry. The type of entry
described by an AgrEDR depends on the scope of the corresponding
attribute. AgrEDRs of a global-scoped
attribute describe gEntries. AgrEDRs of a variable-scoped attribute describe
rEntries.
Scope Signed
4-byte integer, big-endian byte ordering.
The
intended scope of this attribute. The following internal values are
possible...
1 Global scope.
2 Variable scope.
3 Global scope assumed.
4 Variable scope assumed.
Note
that assumed scopes only exist prior to CDF V2.5.
Num Signed
4-byte integer, big-endian byte ordering.
This
attribute's number. Attributes are
numbered beginning with zero (0).
NgrEntries Signed 4-byte integer, big-endian byte ordering.
The
number of g/rEntries for this attribute.
MAXgrEntry Signed 4-byte integer, big-endian byte ordering.
The
maximum numbered g/rEntry for this attribute.
g/rEntries are numbered
beginning with zero (0). If
there are no g/rEntries, this field
will contain negative one (-1).
rfuA Signed
4-byte integer, big-endian byte ordering.
Reserved
for future used. Always set to zero (0).
AzEDRhead Signed
4-byte integer, big-endian byte ordering.
The
file offset of the first Attribute zEntry Descriptor Record (AzEDR) for this
attribute. The first AzEDR contains a
file offset to the next AzEDR and so on.
An AzEDR will exist for each zEntry for this attribute. This field will contain 0x00000000 if this
attribute has no zEntries. The last AzEDR will contain a file offset of
0x00000000 for the file offset of the next AzEDR (to indicate the end of the
AzEDRs). Because zEntries were not
supported by CDF until CDF V2.2, prior to CDF V2.2 this field will always
contain a file offset of 0x00000000.
NzEntries Signed
4-byte integer, big-endian byte ordering.
The
number of zEntries for this attribute.
Prior to CDF V2.2 this field will always contain a value of zero (0).
MAXzEntry Signed
4-byte integer, big-endian byte ordering.
The
maximum numbered zEntry for this attribute.
zEntries are numbered
beginning
with zero (0). Prior to CDF V2.2 this
field will always contain
a
value of negative one (-1).
rfuE Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
Name Character
string, ASCII character set.
The
name of this attribute. This field is
always 64 bytes in length. If the
number
of characters in the name is less than 64, a NUL character (0x00)
will
be used to terminate the string. In
that case, the characters beyond
the
NUL-terminator (up to the size of this field) are undefined.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
ADRnext |
4 bytes |
|
|
AgrEDRhead |
4 bytes |
|
|
ADRhead |
4 bytes |
|
|
Scope |
4 bytes |
|
|
Num |
4 bytes |
|
|
NgrEntries |
4 bytes |
|
|
MAXgrEntry |
4 bytes |
|
|
rfuA |
4 bytes |
|
|
AzEDRhead |
4 bytes |
|
|
NzEntries |
4 bytes |
|
|
rfuE |
4 bytes |
|
|
Name |
64 bytes |
|
Figure 2.6: Attribute Descriptor Record (ADR)
2.5 Attribute Entry Descriptor Record
An Attribute
Entry Descriptor Record (AEDR) contains a description of an attribute
entry. There are two types of
AEDRs: AgrEDRs describing g/rEntries
and AzEDRs describing zEntries.[10] The AgrEDRhead field of an ADR contains the
file offset of the ffrst AgrEDR for the corresponding attribute. Likewise, the AzEDRhead field of an ADR
contains the file offset of the first AzEDR. The linked lists of AEDRs starting
at AgrEDRhead and AzEDRhead will contain only AEDRs of that type - AgrEDRs or
AzEDRs, respectively.
Note that the
term g/rEntry is used to refer to an entry that may be either a gEntry or an
rEntry. The type of entry described by
an AgrEDR depends on the scope of the corresponding attribute. AgrEDRs of a global-scoped attribute
describe gEntries. AgrEDRs of a
variable-scoped attribute describe rEntries.
The scope of an attribute is stored in the Scope field of the
corresponding ADR.
Each AEDR, as
shown in Figure 2.7, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this AEDR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
Either
the value 5 which identifies this as an AgrEDR or the value 9 if
an
AzEDR. Because zEntries were not supported until CDF V2.2, prior to
CDF
V2.2 AzEDRs will not occur in a dotCDF file.
AEDRnext Signed
4-byte integer, big-endian byte ordering.
The
file offset of the next AEDR. Beginning with CDF V2.1 the last AEDR
will
contain a file offset of 0x00000000 in this field (to indicate the end of
the
AEDRs). Prior to CDF V2.1 this file
offset is undefined in the last
AEDR.[11]
Num Signed
4-byte integer, big-endian byte ordering.
The
attribute number to which this entry corresponds. Attributes are num-
bered
beginning with zero (0).
DataType Signed
4-byte integer, big-endian byte ordering.
The
data type of this entry. The possible
data type internal values are described in Section 5.3.
EntryNum Signed
4-byte integer, big-endian byte ordering.
This
entry's number. Entries are numbered
beginning with zero (0).
NumElems Signed
4-byte integer, big-endian byte ordering.
The
number of elements of the data type (specified by the DataType field)
for
this entry.
rfuA Signed
4-byte integer, big-endian byte ordering.
Reserved
for future used. Always set to zero
(0).
rfuB Signed
4-byte integer, big-endian byte ordering.
Reserved
for future used. Always set to zero
(0).
rfuC Signed
4-byte integer, big-endian byte ordering.
Reserved
for future used. Always set to zero
(0).
rfuD Signed
4-byte integer, big-endian byte ordering.
Reserved
for future used. Always set to negative
one (-1).
rfuE Signed
4-byte integer, big-endian byte ordering.
Reserved
for future used. Always set to negative
one (-1).
Value This
entry's value. This consists of the
number of elements (specified by the NumElems field) of the data type
(specified by the DataType field). This
can be thought of as a 1-dimensional array of values (stored contiguously). The size of this field is the product of the
number of elements and the size in bytes of each element. The encoding of the elements depends on the
data encoding of the CDF (which is contained in the Encoding field of the CDR).
The possible encodings are described in Section 5.3.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
AEDRnext |
4 bytes |
|
|
Num |
4 bytes |
|
|
DataTyp |
4 bytes |
|
|
EntryNum |
4 bytes |
|
|
NumElems |
4 bytes |
|
|
rfuA |
4 bytes |
|
|
rfuB |
4 bytes |
|
|
rfuC |
4 bytes |
|
|
rfuD |
4 bytes |
|
|
rfuE |
4 bytes |
|
|
Value |
Variable |
Size depends on the DataType and NumElems fields. |
Figure 2.7: Attribute Entry Descriptor Record (AEDR)
2.6 Variable Descriptor Record
A Variable
Descriptor Record (VDR) contains a description of a variable in a CDF. There are two types of VDRs: rVDRs describing rVariables and zVDRs
describing zVariables.[12] The rVDRhead field of the GDR contains the
file offset of the first rVDR. Likewise, the zVDRhead field of the GDR contains
the file offset of the first zVDR. The linked lists of VDRs starting at
rVDRhead and zVDRhead will contain only VDRs of that type - rVDRs or zVDRs,
respectively. If this variable is
compressed, a pointer to a Compressed Parameters Record (CPR) is set in the
CPRorSPRoffset field.
Each VDR, as
shown in Figure 2.8, contains the following contiguous fields...[13]
RecordSize Signed 4-byte integer,
big-endian byte ordering.
The
size in bytes of this VDR (including this field).
RecordType Signed 4-byte
integer, big-endian byte ordering.
Either
the value 3 which identifies this as an rVDR or the value 8 if a zVDR. Because zVariables were not supported until
CDF V2.2, prior to CDF V2.2 zVDRs will not occur in a dotCDF file.
VDRnext Signed 4-byte integer,
big-endian byte ordering.
The
file offset of the next VDR. Beginning with CDF V2.1 the last VDR will contain a file offset of 0x00000000 in
this field (to indicate the end of the VDRs).
Prior to CDF V2.1 this file offset is undefined in the last VDR.[14]
DataType Signed 4-byte integer,
big-endian byte ordering.
The
data type of this entry. The possible
data type internal values are described in Section 5.3.
MaxRec Signed 4-byte integer,
big-endian byte ordering.
The
maximum record number written to this variable. Variable records are numbered beginning at zero (0). If no records have been written to this
variable, this field will contain negative one (-1).
VXRhead Signed 4-byte integer,
big-endian byte ordering.
The
file offset of the first Variable Index Record (VXR). VXRs are used in
single-file CDFs to store the locations of Variable Value Records (VVRs). VVRs are used to store variable records in
single-file CDFs. VXRs are described in
Section 2.7 and VVRs are described in Section 2.8. The first VXR contains the file offset of the next VXR and so
on. The last VXR contains a file offset
of 0x00000000 for the file offset of the next VXR (to indicate the end of the
VXRs). In single-file CDFs, if no
records have been written to this variable, this field will contain a file
offset of 0x00000000.
For
multi-file CDFs variable records are stored in separate files and this field
will always contain a file offset of 0x00000000. The variable files of a
multi-file CDF are described in Chapter 3.
VXRtail Signed 4-byte integer,
big-endian byte ordering.
The
file offset of the last VXR. See the VXRhead field above for a description of
VXRs.
Flags Signed 4-byte
integer, big-endian byte ordering.
BooleAn
flags, one per bit, describing some aspect of this variable. Bit numbering is described in Chapter 5. The meaning of each bit is as follows...
0 The
record variance of this variable. Set
indicates a TRUE record variance. Clear
indicates a FALSE record variance.
1 Whether
or not a pad value is specified for this variable. Set indicates that a pad value has been specified. Clear indicates that a pad value has not
been specified. The PadValue field
described below is only present if a pad value has been specified.
2 Whether
or not a compression method is applied to this variable. Set indicates that a compression has been
used. Clear indicates that a
compression has not been used. The
CPRorSPRoffset field described below provides the offset of the Compressed
Parameters Record if this compression bit is set.
3-31 Reserved
for future use. These bits are always
clear.
sRecords Signed 4-byte integer,
big-endian byte ordering.
Type
of sparse records: no sparserecords, padded sparserecords, or previous
sparserecords.
rfuB Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to zero (0).
rfuC Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
rfuF Signed 4-byte
integer, big-endian byte ordering.
Reserved
for future use. Always set to negative
one (-1).
NumElems Signed 4-byte integer,
big-endian byte ordering.
The
number of elements of the data type (specified by the DataType field)
for
this variable at each value.
Num Signed 4-byte
integer, big-endian byte ordering.
This
variable's number. Variables are numbered
beginning with zero (0).
Note
that rVariables and zVariables are each numbered beginning with zero
(0)
and are considered two separate groups of variables.
CPRorSPRoffset Signed 4-byte integer, big-endian byte
ordering.
CPR/SPR
offset depending on bits set in 'Flags'.
If neither compression
nor
sparse arrays, set to 0xFFFFFFFF.
BlockingFactor Signed 4-byte integer, big-endian
byte ordering.
Blocking
factor for this variable.
Name Character string,
ASCII character set.
The
name of this variable. This field is
always 64 bytes in length. If the
number
of characters in the name is less than 64, a NUL character (0x00)
will
be used to terminate the string. In
that case, the characters beyond
the
NUL-terminator (up to the size of this field) are undefined.
zNumDims Signed 4-byte integer,
big-endian byte ordering.
The
number of dimensions for this zVariable.
This field will not be present if this is an rVDR (rVariable).
zDimSizes Signed 4-byte integers,
big-endian byte ordering within each.
Zero
or more contiguous dimension sizes for this zVariable depending on the value of
the zNumDims field. This field will not
be present if this is an rVDR (rVariable).
DimVarys Signed 4-byte integers,
big-endian byte ordering within each.
Zero
or more contiguous dimension variances. If this is an rVDR, the number of dimension
variances will correspond to the value of the rNumDims field of the GDR. If
this is a zVDR, the number of dimension variances will correspond to the value
of the zNumDims field in this zVDR. A
value of negative one (-1) indicates a TRUE dimension variance and a value of
zero (0) indicates a FALSE dimension variance.
PadValue The
variable's pad value. If bit 1 of the
Flags field of this VDR is clear, then a pad value has not been specified for
this variable and this field will not be present. If a pad value has been specified, the size of this field depends
on the number of elements and the size of the data type. The encoding of the elements depends on the
encoding of the CDF (which is contained in the Encoding field of the CDR). The possible encodings are described in
Section 5.3.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
VDRnext |
4 bytes |
|
|
DataTyp |
4 bytes |
|
|
MaxRec |
4 bytes |
|
|
VXRhead |
4 bytes |
|
|
VXRtail |
4 bytes |
|
|
Flags |
4 bytes |
|
|
SRecords |
4 bytes |
|
|
rfuB |
4 bytes |
|
|
rfuC |
4 bytes |
|
|
rfuF |
4 bytes |
|
|
NumElems |
4 bytes |
|
|
Num |
4 bytes |
|
|
CPRorSPRoffset |
4 bytes |
|
|
BlockingFactor |
4 bytes |
|
|
Name |
4 bytes |
|
|
zNumDims |
|
4 bytes if a zVDR. Not present if an rVDR. |
|
zDimSizes |
4 bytes |
Size depends on the zNumDims field if a zVDR (but not
present if zero dimensions). Not
present if an rVDR. |
|
DimVarys |
4 bytes |
Size depends on the zNumDims field if a zVDR (but not
present if zero dimensions). Size
depends on the rNumDims field of the GDR if an rVDR (but not present if zero
dimensions). |
|
PadValue |
Variable |
Size depends on DataType and NumElems fields. Not present if bit 1 of Flags field is not
set. |
Figure 2.8: Variable Descriptor Record (VDR)
Variable
Index Records (VXRs) are used in single-file CDFs to store the file offsets of
Variable Values Records (VVRs). VVRs
contain a group of records written to a variable and are described in Section
2.8. VXRs (and VVRs) will not exist in
the dotCDF file of a multi-file CDF (because the variable records are stored in
separate files as described in Chapter 3).
The VXRhead
field of a VDR in a single-file CDF contains the file offset of the first VXR
for the corresponding variable. The
first VXR contains the file offset of the next VXR and so on. As many VXRs as are necessary will exist
(depending on the number of VVRs for the variable). The VXRtail field of a VDR contains the file offset of the last
VXR for the corresponding variable.
Each VXR, as
shown in Figure 2.9, contains the following contiguous fields...
RecordSize Signed 4-byte integer,
big-endian byte ordering.
The
size in bytes of this VXR (including this field).
RecordType Signed 4-byte
integer, big-endian byte ordering.
The
value 6 which identifies this as a VXR.
VXRnext Signed 4-byte integer,
big-endian byte ordering.
The
file offset of the next VXR. The last VXR will contain a file offset of
0x00000000
in this field (to indicate the end of the VXRs).
Nentries Signed 4-byte integer,
big-endian byte ordering.
The
number of index entries in this VXR. This is the maximum number of
VVRs
that may be indexed using this VXR.
NusedEntries Signed 4-byte integer, big-endian
byte ordering.
The
number of index entries actually used in this VXR.
First Signed 4-byte
integers, big-endian byte ordering within each.
This
is a contiguous array of variable
record numbers with each record number being the first variable record in the
corresponding VVR. The size of this
array depends on the value of the Nentries field. The nth entry in this array corresponds to the nth entry in the
Last and Offset fields. Unused entries
in this array contain 0xFFFFFFFF. Note that variable records are numbered
beginning with zero (0).
Last Signed 4-byte
integers, big-endian byte ordering within each.
This
is a contiguous array of variable record numbers with each record number being
the last variable record in the corresponding VVR. The size of this array
depends on the value of the Nentries field.
The nth entry in this array corresponds to the nth entry in the First
and Offset fields. Unused entries in
this array contain 0xFFFFFFFF. Note that variable records are numbered
beginning with zero (0).
Offset Signed 4-byte
integers, big-endian byte ordering within each.
This
is a contiguous array of file offsets with each being the file offset of the
corresponding VVR. The size of this array depends on the value of the Nentries
field. The nth entry in this array
corresponds to the nth entry in the First and Last fields. Unused entries in this
array contain 0xFFFFFFFF.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
VXRnext |
4 bytes |
|
|
Nentries |
4 bytes |
|
|
NusedEntries |
4 bytes |
|
|
First |
variable |
Size depends on the Nentries field. |
|
Last |
variable |
Size depends on the Nentries field. |
|
Offset |
variable |
Size depends on the Nentries field. |
Figure 2.9: Variable Index Record (VXR)
Consider the
following example VXR contents (for a variable having only one VXR)...
RecordSize: 140
RecordType: 6
VXRnext: 0x00000000
Nentries: 10
NusedEntries: 2
First: 0,
100, 0xFFFFFFFF, 0xFFFFFFFF, ...
Last: 99,
149, 0xFFFFFFFF, 0xFFFFFFFF, ...
Offset: 0x0000A400,
0x0000B554, 0xFFFFFFFF, 0xFFFFFFFF, ...
There are two
index entries being used. The first
indicates that variable records 0 through 99 are stored in the VVR at file
offset 0x0000A400 and the second indicates that variable records 100 through
149 are stored in the VVR at file offset 0x0000B554.
Variable
Value Records (VVRs) are used to store one or more variable records in a
single-file CDF. VVRs will not exist in
multi-file CDFs (where variable records are stored in separate files). The contents of a variable record are
described in Chapter 4.
Each VVR, as
shown in Figure 2.10, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this VVR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 7 which identifies this as a VVR.
Records A
group of one or more variable records. The record numbers in this group will be
contiguous. The size of this field
depends on the number of variable records in the group and the size of each
record. The size of each record will be
the same and depends on the dimensionality, dimension variances, data type, and
number of elements per value of the corresponding variable. These properties are discussed in Chapter
4. The encoding of the values in each
variable record depends on the encoding of the CDF (which is stored in the
Encoding field of the CDR). The possible encodings are described in Chapter 5.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
Records |
variable |
Size depends on the number of variable records in this VVR
and the variable's data type, number of elements per value, dimensionality,
and dimension variances. |
Figure 2.10: Variable Values Record (VVR)
A Compressed
CDF Record (CCR) is used to store the data from a compressed single-file
CDF. A CCR is created when the whole
CDF is compressed. It will not be
created if only variables (some or even all) are compressed. Only two internal records exist in a fully
compressed CDF. Other than a CCR, another record is a Compression Parameters
Record (CPR) which is pointed to by the CCR. The CPR provides the compression
information, e.g., compression method and level, etc., used to compress the CDF
file. A CCR will not exist in
multi-file CDFs.
Each CCR, as
shown in Figure 2.11, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this CCR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 10 which identifies this as a CCR.
CPRoffset Signed
4-byte integer, big-endian byte ordering.
File
offset to the Compressed Parameters Record (CPR) (bytes).
uSize Signed
4-byte integer, big-endian byte ordering.
Size
of the CDF in its uncompressed IRs form.
This byte count does NOT include the magic numbers.
rfuA Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Set to zero.
data Compressed
CDF data.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
CPRoffset |
4 bytes |
|
|
uSize |
4 bytes |
|
|
rfuA |
4 bytes |
|
|
data |
variable |
Size is RecordSize - 20 bytes. |
Figure 2.11: Compressed CDF Record (CCR)
2.10 Compressed Parameters Record
A Compressed
Paramters Record (CPR) is used to keep the information as the compression
method and level used to create a CDF or variable. This record is pointed to by either a CCR or a VDR. When a
compression is applied to the whole
CDF, the CPR is pointed to by the CCR.
If a compression is only applied to a variable, a CPR is pointed to by a
VDR. Currently, only Run-Length Encoding (RLE), Huffman (HUFF), Adaptive
Huffman (AHUFF) and GNU GZIP compression algorithms are supported.[15]
Each CPR, as
shown in Figure 2.12, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this CPR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 11 which identifies this as a CPR.
cType Signed
4-byte integer, big-endian byte ordering.
Type
of compression.
rfuA Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Set to zero.
pCount Signed
4-byte integer, big-endian byte ordering.
Compression
parameter count. Currently, it is 1.
cParms Signed
4-byte integer, big-endian byte ordering.
Compression level.
For RLE, HUFF and AHUFF, cParms[0] is 0. For GZIP, it is between 1 and 9.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
cType |
4 bytes |
|
|
rufA |
4 bytes |
|
|
pCount |
4 bytes |
|
|
cParms |
variable |
Size depends on pCount |
Figure 2.12: Compressed Paramters Record (CPR)
2.11 Sparseness Paramters Record
A Sparseness
parameters Record (SPR) is used to store sparse array information used by a
variable record in a CDF. Currently, it has not yet been implemented in the
V2.6 and V2.7 distribtuion.
Each SPR, as
shown in Figure 2.13, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this SPR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 11 which identifies this as a SPR.
sArraysType Signed 4-byte integer, big-endian byte ordering.
include
the magic numbers.
rfuA Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Set to zero.
pCount Signed
4-byte integer, big-endian byte ordering.
Sparseness
parameter count.
sArraysParms Signed 4-byte integer, big-endian byte ordering.
Parameters
for sparseness arrays.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
sArraysType |
4 bytes |
|
|
rufA |
4 bytes |
|
|
pCount |
4 bytes |
|
|
sArraysParms |
variable |
Size depends on pCount |
Figure 2.13: Sparseness Parameters Record (SPR)
2.12 Compressed Variable Values Record
A Compressed
Variable Values Record (CVVR) is used to store one section of compressed
variable values records (VVRs) for a variable in a single-file CDF. This section of VVRs while uncompressed are
contiguous in the physical file or scratch temporary file. CVVRs will not exist in multi-file CDFs.
Each CVVR, as
shown in Figure 2.14, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this CVVR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value 12 which identifies this as a CVVR.
rfuA Signed
4-byte integer, big-endian byte ordering.
Reserved
for future use. Set to zero.
cSize Signed
4-byte integer, big-endian byte ordering.
Size
in bytes of the compressed data which follows.
data Compressed
data.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
rufA |
4 bytes |
|
|
cSize |
4 bytes |
|
|
data |
variable |
Size is specified in cSize |
Figure 2.14: Compressed Variable Values Record (CVVR)
Internal
records in the dotCDF file of a CDF may become unused due to a number of
reasons. When that occurs, the internal
record is marked as being unused and is placed on a double-linked list of
Unused Internal Records (UIRs). The
UIRhead field of the GDR contains the file offset of the first UIR. The first UIR contains the file offset of
the next UIR and so on. The last UIR
contains a file offset of 0x00000000 as the file offset of the next UIR (to
indicate the end of the UIRs).
Likewise, the last UIR contains the file offset of the previous UIR and
so on. The first UIR contains a file
offset of 0x00000000 as the file offset of the previous UIR (to indicate the
start of the UIRs).
Each UIR, as
shown in Figure 2.15, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this UIR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value -1 which identifies this as a UIR.
(See the section on UUIRs below
for a slight complication.)
NextUIR Signed
4-byte integer, big-endian byte ordering.
The
file offset of the next UIR. The last
UIR will contain a file offset of 0x00000000 in this field (to indicate the end
of the UIRs).
PrevUIR Signed
4-byte integer, big-endian byte ordering.
The
file offset of the previous UIR. The first UIR will contain a file offset of 0x00000000
in this field (to indicate the start of the UIRs).
Remainder Zero
or more unused bytes which constitute the remainder of the UIR.
The
contents of this field are undefined.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
NextUIR |
4 bytes |
|
|
PrevUIR |
4 bytes |
|
|
Remainder |
variable |
Size depends on the size of this UIR. |
Figure 2.15: Unused Internal Record (UIR)
It is
possible to have internal records in the dotCDF file of a CDF that are unused
but are not considered UIRs. Let's call
them Unsociable Unused Internal Records (UUIRs) because they are not on the
double-linked list of UIRs that begins at the file offset contained in the
UIRhead field of the GDR. CDFs prior to CDF V2.5 will contain only UUIRs
because UIRs were not yet supported.
Beginning with CDF V2.5 UUIRs may also exist due to special
circumstances (e.g, if an internal record that is no longer needed is less than
16 bytes which means that it is too small to be made a UIR).
Each UUIR, as
shown in Figure 2.16, contains the following contiguous fields...
RecordSize Signed 4-byte integer, big-endian byte ordering.
The
size in bytes of this UUIR (including this field).
RecordType Signed 4-byte integer, big-endian byte ordering.
The
value -1 which identifies this as a UUIR.
Unfortunately this is the same value as that used for UIRs. UUIRs are distinguished from UIRs by the
fact that they are not on the double-linked list of UIRs.
Remainder Zero
or more unused bytes which constitute the remainder of the UUIR.
The
contents of this field are undefined.
|
Field |
Size |
Comments |
|
RecordSize |
4 bytes |
|
|
RecordType |
4 bytes |
|
|
Remainder |
variable |
Size depends on the size of this UUIR. |
Figure 2.16: Unsociable Unused Internal Record (UUIR)
In multi-file
CDFs, variable records are stored in separate files - one per variable.
Assuming a base name of <cdfname>, the CDF would consist of the file
named <cdfname>.cdf,[16]
a file named <cdfname>.v<i> for each rVariable (where <i> is
the rVariable number), and a file named <cdfname>.z<j> for each
zVariable (where <j> is the zVariable number). Note that variables are numbered beginning with zero (0). For example, a multi-file CDF named sample
having three rVariables would consist of the files sample.cdf, sample.v0, sample.v1,
and sample.v2.
Within each
variable file are stored the corresponding
variable records. The variable
records are stored contiguously beginning with record number zero (0) with no
gaps in the record numbering. The
number of records will correspond to the MaxRec field of the variable's VDR
(described in Section 2.6). The size of
each variable record will be the same and depends on the dimensionality, dimension variances, data type, and number
of elements per value of the corresponding variable. These properties are discussed in Chapter 4. The encoding of the values in each variable
record depends on the encoding of the CDF (which is stored in the Encoding
field of the CDR). The possible encodings are described in Chapter 5.
Variable
records contain the values written to a variable. Each variable record contains one variable array. The physical layout of a variable array
depends on the dimensionality and dimension variances of the variable and the
variable majority of the CDF. The
dimensionality of an rVariable is contained in the rNumDims and rDimSizes
fields of the GDR. The dimensionality
of a zVariable is contained in the zNumDims and rDimSizes fields of the
corresponding zVDR. Dimension variances
are contained in the DimVarys field of the corresponding rVDR/zVDR. The CDF's
variable majority is contained in bit 0 of the Flags field of the CDR. Note
also that each variable array value consists of some number of elements of the
variable's data type. A variable's data
type and number of elements of that data type at each variable value are
contained in the DataType and NumElems fields of the corresponding rVDR/zVDR.
Dimension
variances allow a conceptual view of a physical variable array. For each array dimension, if the
corresponding dimension variance is TRUE, then the dimension actually
exists. If the dimension variance is
FALSE, then the dimension is virtual and is not physically stored. This would probably be a good time for an
example. Assume a variable with the
following characteristics...
Data Type CDF_REAL4
Number of Elements 1
Number of Dimensions 2
Dimension Sizes 3,5
Dimension Variances TRUE,FALSE
The
conceptual view of this variable array is that of a 3 by 5 2-dimensional array
(represented by the syntax 2:[3,5]).
The TRUE,FALSE dimension variances indicate that the first dimension is
real (physically stored) but that the second dimension is virtual (not
physically stored). When an application
accesses a value in this variable array two dimension indices are specified,
one per dimension (represented by the syntax (i,j) where i and j are the
dimension indices). The first index is
used to physically position to a value in the array (because the corresponding
dimension variance is TRUE). The second index, however, is essentially ignored
because the corresponding dimension variance of FALSE indicates that the second
dimension is virtual and is not physically stored. Conceptually, all values along the second dimension are the same
(and are the one value which is physically stored). This means that (i,0), (i,1), (i,2), (i,3), and (i,4) all map to
the same physical location in the variable array for any given first dimension
index (i). For this variable record
stored at a file offset of n (in the dotCDF file or a variable file), the
conceptual values would map to the physical values as follows...
|
File Offset of Physical
Value |
Indices of Conceptual Value(s) |
|
n |
(0,0),(0,1),(0,2),(0,3),(0,4) |
|
n+4 |
(1,0),(1,1),(1,2),(1,3),(1,4) |
|
n+8 |
(2,0),(2,1),(2,2),(2,3),(2,4) |
Note that
only three values are physically stored with each consisting of four bytes
(which is the size of one element of the CDF_REAL4 data type).
Had the
dimension variances been FALSE,TRUE instead, the conceptual to physical
mapping would be as
follows...
|
File Offset of Physical
Value |
Indices of Conceptual Value(s) |
|
n |
(0,0),(1,0),(2,0) |
|
n+4 |
(0,1),(1,1),(2,1) |
|
n+8 |
(0,2),(1,2),(2,2) |
|
n+12 |
(0,3),(1,3),(2,3) |
|
n+16 |
(0,4),(1,4),(2,4) |
In this case
five values are physically stored and it is along the first dimension that all
values are conceptually the same.
It is not
until two or more of the dimensions are physically stored (having dimension
variances of TRUE) that the variable majority of the CDF has an effect. Row majority means that the first dimension
changes slowest in the physical storage of the array and column majority means
that the last dimension changes the slowest.
Assume that in our example the dimension variances are TRUE,TRUE. The physical layout of the array values for
each variable majority would be as follows...
|
File Offset of Physical Value |
Indices of Conceptual Value(s), Row Majority |
Indices of Conceptual Value(s), Column Majority |
|
n |
(0,0) |
(0,0) |
|
n+4 |
(0,1) |
(1,0) |
|
n+8 |
(0,2) |
(2,0) |
|
n+12 |
(0,3) |
(0,1) |
|
n+16 |
(0,4) |
(1,1) |
|
n+20 |
(1,0) |
(2,1) |
|
n+24 |
(1,1) |
(0,2) |
|
n+28 |
(1,2) |
(1,2) |
|
n+32 |
(1,3) |
(2,2) |
|
n+36 |
(1,4) |
(0,3) |
|
n+40 |
(2,0) |
(1,3) |
|
n+44 |
(2,1) |
(2,3) |
|
n+48 |
(2,2) |
(0,4) |
|
n+52 |
(2,3) |
(1,4) |
|
n+56 |
(2,4) |
(2,4) |
Note that an
application's conceptual view of the variable array does not depend on the
variable majority. When an application
accesses the value at indices (i,j) the proper value will be accessed. The physical location of that value,
however, depends very much on the variable majority of the CDF.
0-dimensional
and 1-dimensional variables are relatively simple. The variable array of a
0-dimesional variable consists of one physically stored value. 1-dimensional variable arrays are stored as
a vector of one or more physical values when the dimension variance is TRUE or
just a single physically stored value when the dimension variance is FALSE
(with all of the values along the dimension being conceptually the same).
When a variable value consists of more than one
element (e.g., character data having the CDF_CHAR data
type), all of the elements of that value are stored contiguously with the first
element being at the lowest file offset.
The size in
bytes of a variable record is the product of the size in bytes of the data
type, the number of elements of the data type at each variable value, and the
size of each dimension having a variance of TRUE.
As a final
example consider a variable with the following characteristics...
Data Type CDF_CHAR
number of Elements 5
number of Dimensions 3
Dimension Sizes 2,3,4
Dimension Variances TRUE,FALSE,TRUE
The
conceptual value to physical value mapping for each majority would be as
follows...
|
File Offset of Physical Value |
Indices of Conceptual Value(s), Row Majority |
Indices of Conceptual Value(s), Column Majority |
|
n |
(0,0,0),(0,1,0),(0,2,0) |
(0,0,0),(0,1,0),(0,2,0) |
|
n+5 |
(0,0,1),(0,1,1),(0,2,1) |
(1,0,0),(1,1,0),(1,2,0) |
|
n+10 |
(0,0,2),(0,1,2),(0,2,2) |
(0,0,1),(0,1,1),(0,2,1) |
|
n+15 |
(0,0,3),(0,1,3),(0,2,3) |
(1,0,1),(1,1,1),(1,2,1) |
|
n+20 |
(1,0,0),(1,1,0),(1,2,0) |
(0,0,2),(0,1,2),(0,2,2) |
|
n+25 |
(1,0,1),(1,1,1),(1,2,1) |
(1,0,2),(1,1,2),(1,2,2) |
|
n+30 |
(1,0,2),(1,1,2),(1,2,2) |
(0,0,3),(0,1,3),(0,2,3) |
|
n+35 |
(1,0,3),(1,1,3),(1,2,3) |
(1,0,3),(1,1,3),(1,2,3) |
In this
example each variable record would consist of 40 bytes (which is the product of
the size in bytes of one element of the data type [1], the number of elements
of the data type at each variable value [5], the size of the first dimension
[2], and the size of the last dimension [4]).
The following
sections will refer to fields of one or more bits. In all cases the lowest numbered bit is the least significant.
A byte
consists of eight bits numbered 0 through 7 (with bit 0 being the least
significant). When values consisting of
more than one byte are referenced, the lowest numbered byte is stored at the
lowest file offset. (The lowest numbered byte is not necessarily the least
significant byte.)
Integers
consist of one, two, or four bytes.
1-byte integers contain eight bits numbered 0 through 7. 2-byte integers contain 16 bits numbered 0
through 15. 4-byte integers contain 32
bits numbered 0 through 31. In each
case bit 0 is the least significant bit.
Signed
integers are stored in two's-complement binary notation. For 1-byte integers this provides a range of
values from -128 through 127. For
2-byte integers this provides a range of values from -32768 through 32767. For 4-byte integers this provides a range of
values from -2147483648 through 2147483647.
Unsigned
integers are stored in binary notation.
For 1-byte integers this provides a range of values from 0 through
255. For 2-byte integers this provides
a range of values from 0 through 65535.
For 4-byte integers this provides a range of values from 0 through
4294967295.
Little-endian
integers are stored with the least-significant byte first (i.e., at the lowest
file offset) and big-endian integers are stored with the most-significant byte
first. Table 5.1 illustrates
little-endian and big-endian byte orderings.
|
|
Little-Endian |
Big-Endian |
||
|
|
Byte/Offste |
Contents |
Byte/Offset |
Contents |
|
2-byte |
0 |
bits 0-7 |
0 |
bits 8-15 |
|
integer |
1 |
bits 8-15 |
1 |
bits 0-7 |
|
|
0 |
bits 0-7 |
0 |
bits 24-31 |
|
4-byte |
1 |
bits 8-15 |
1 |
bits 16-23 |
|
integer |
2 |
bits 16-23 |
2 |
bits 8-15 |
|
|
3 |
bits 24-31 |
3 |
bits 0-7 |
Table 5.1: Little-Endian vs. Big-Endian
Several
floating-point encodings are possible in a CDF. Each is described in the following sections. Note that a loss of precision may occur when
converting between the various encodings because of differences in the number
of mantissa bits. Likewise, there are
differences in the minimum and maximum magnitudes which may be represented
because of differences in the number of exponent bits. Appendix A illustrates how the different single-precision
floating-point encodings map to actual floating-point values and Appendix B
illustrates the same for double-precision floating-point encodings.
IEEE 754 Single-Precision Floating-Point
IEEE[17]
754 single-precision floating-point values consist of four bytes containing one
sign bit, eight exponent bits
(numbered 0 through
7), and 23 mantissa bits
(numbered 0 through 22). IEEE 754 single-precision floating-point values are stored in one
of two ways: little-endian or big-endian.
The arrangements of the bits are shown in Tables 5.2 and 5.3,
respectively.
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-7 |
mantissa bits 0-7 |
|
1 |
0-7 |
mantissa bits 8-15 |
|
2 |
0-6 |
mantissa bits 16-22 |
|
|
7 |
exponent bit 0 |
|
3 |
0-6 |
exponent bits 1-7 |
|
|
7 |
sign bit (negative if set) |
Table 5.2: IEEE 754, Single-Precision Floating-Point,
Little-Endian
Digital's F_FLOAT Single-Precision Floating-Point
Digital's[18] F_FLOAT single-precision floating-point
values consist of four bytes containing one sign bit, eight exponent bits
(numbered 0 through 7), and 23 mantissa bits (numbered 0 through 22). The arrangement of the bits is shown in
Table 5.4.
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-6 |
exponent bits 1-7 |
|
|
7 |
sign bit (negative if set) |
|
1 |
0-6 |
mantissa bits 16-22 |
|
|
7 |
exponent bit 0 |
|
2 |
0-7 |
mantissa bits 8-15 |
|
3 |
0-7 |
mantissa bits 0-7 |
Table 5.3: IEEE 754, Single-Precision Floating-Point,
Big-Endian
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-6 |
mantissa bits 16-22 |
|
|
7 |
exponent bit 0 |
|
1 |
0-6 |
exponent bits 1-7 |
|
|
7 |
sign bit (negative if set) |
|
2 |
0-7 |
mantissa bits 0-7 |
|
3 |
0-7 |
mantissa bits 8-15 |
Table 5.4: Digital's F_FLOAT, Single-Precision
Floating-Point
IEEE 754 Double-Precision Floating-Point
IEEE 754
double-precision floating-point values consist of eight bytes containing one
sign bit, eleven exponent bits (numbered 0 through 10), and 52 mantissa bits
(numbered 0 through 51). IEEE 754
double-precision floating-point values are stored in one of two ways:
little-endian or big-endian. The
arrangements of the bits are shown in Tables 5.5 and 5.6, respectively.
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-7 |
mantissa bits 0-7 |
|
1 |
0-7 |
mantissa bits 8-15 |
|
2 |
0-7 |
mantissa bits 16-23 |
|
3 |
0-7 |
mantissa bits 24-31 |
|
4 |
0-7 |
mantissa bits 32-39 |
|
5 |
0-7 |
mantissa bits 40-47 |
|
6 |
0-3 |
mantissa bits 48-51 |
|
|
4-7 |
exponent bits 0-3 |
|
7 |
0-6 |
exponent bits 4-10 |
|
|
7 |
sign bit (negative if set) |
Table 5.5: IEEE 754, Double-Precision Floating-Point, Little-Endian
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-6 |
exponent bits 4-10 |
|
|
7 |
sign bit (negative if set) |
|
1 |
0-3 |
mantissa bits 48-51 |
|
|
4-7 |
exponent bits 0-3 |
|
2 |
0-7 |
mantissa bits 40-47 |
|
3 |
0-7 |
mantissa bits 32-39 |
|
4 |
0-7 |
mantissa bits 24-31 |
|
5 |
7-7 |
mantissa bits 16-23 |
|
6 |
0-7 |
mantissa bits 8-15 |
|
7 |
0-7 |
mantissa bits 0-7 |
Table 5.6: IEEE 754, Double-Precision Floating-Point,
Big-Endian
Digital's D_FLOAT Double-Precision
Floating-Point
Digital's
D_FLOAT double-precision floating-point values consist of eight bytes
containing one sign bit, eight exponent bits (numbered 0 through 7), and 55
mantissa bits (numbered 0 through 54).
The arrangement of the bits is shown in Table 5.7.
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-6 |
mantissa bits 48-54 |
|
|
7 |
exponent bit 0 |
|
1 |
0-6 |
exponent bits 1-7 |
|
|
7 |
sign bit (negative if set) |
|
2 |
0-7 |
mantissa bits 32-39 |
|
3 |
0-7 |
mantissa bits 40-47 |
|
4 |
0-7 |
mantissa bits 16-23 |
|
5 |
7-7 |
mantissa bits 24-31 |
|
6 |
0-7 |
mantissa bits 0-7 |
|
7 |
0-7 |
mantissa bits 8-15 |
Table 5.7: Digital's D_FLOAT, Double-Precision
Floating-Point
Digital's G_FLOAT Double-Precision
Floating-Point
Digital's
G_FLOAT double-precision floating-point values consist of eight bytes
containing one sign bit, eleven exponent bits (numbered 0 through 10), and 52
mantissa bits (numbered 0 through 51).
The arrangement of the bits is shown in Table 5.8.
|
Byte/Offset |
Bit(s) |
Contents |
|
0 |
0-3 |
mantissa bits 48-51 |
|
|
4-7 |
exponent bits 0-3 |
|
1 |
0-6 |
exponent bits 4-10 |
|
|
7 |
sign bit (negative if set) |
|
2 |
0-7 |
mantissa bits 32-39 |
|
3 |
0-7 |
mantissa bits 40-47 |
|
4 |
0-7 |
mantissa bits 16-23 |
|
5 |
7-7 |
mantissa bits 24-31 |
|
6 |
0-7 |
mantissa bits 0-7 |
|
7 |
0-7 |
mantissa bits 8-15 |
Table 5.8: Digital's G_FLOAT, Double-Precision
Floating-Point
Two types of
data are stored in a CDF - control information and application data. Control information is used to manage the
application data stored in a CDF. A user application generally does not have
access to the control information.[19] Throughout this document, individual pieces
of control information will also be referred to as “internal values."
Integer
control information is stored in 4-byte signed or unsigned integers with
big-endian byte ordering.
Two's-complement is used for signed integers.
Character
string control information is stored using the ASCII character set. The character strings are NUL-terminated[20]
unless the number of characters is exactly equal to the size of the field
containing the character string.
Application
data consists of attribute entry values (commonly referred to as
“metadata") and variable values (simply referred to as “data"). Note that some of the control information
stored in a CDF could also be considered application metadata (e.g., attribute
and variable names, the CDF's data encoding and variable majority, and variable
dimensionalities). For the purpose of
this document, however, these internal values will be considered control
information.
Application
data values are stored according to the data encoding of the CDF. A CDF's data encoding is stored in the CDF
Descriptor Record (CDR) described in Section 2.2. Application data values are
also stored as one of the supported CDF data types. Table 5.9 lists the supported data types and the corresponding
internal values used to identify each data type.
The possible
data encodings for a CDF correspond to the platforms on which the CDF software
distribution is supported. Table 5.10
lists the currently supported data encodings along with the corresponding
internal values used to identify each data encoding.
Table 5.11
shows how each of the supported data types are stored for a particular data
encoding. Note that many of the data
encodings are actually stored in the same way.
Table 5.11 shows the equivalent data encodings.
|
Data Type |
Internal Value |
Description |
|
CDF_INT1 |
1 |
1-byte,
signed integer. |
|
CDF_INT2 |
2 |
2-byte,
signed integer. |
|
CDF_INT4 |
4 |
4-byte,
signed integer. |
|
CDF_UINT1 |
11 |
1-byte,
unsigned integer. |
|
CDF_UINT2 |
12 |
2-byte,
unsigned integer. |
|
CDF_UINT4 |
14 |
4-byte,
unsigned integer. |
|
CDF_BYTE[21] |
41 |
1-byte,
signed integer. |
|
CDF_REAL4 |
21 |
4-byte,
single-precision floating-point. |
|
CDF_REAL8 |
22 |
8-byte,
double-precision floating-point. |
|
CDF_FLOAT[22] |
44 |
4-byte,
single-precision floating-point. |
|
CDF_DOUBLE[23] |
45 |
8-byte,
double-precision floating-point. |
|
CDF_EPOCH[24] |
31 |
8-byte,
double-precision floating-point. |
|
CDF_CHAR |
51 |
1-byte,
signed character (ASCII).[25] |
|
|
52 |
|
Table 5.9: Supported Data Types
|
Data
Encoding |
Internal Value |
Description |
|
NETWORK_ENCODING |
1 |
eXternal
Data Representation |
|
SUN_ENCODING |
2 |
Sun
representation |
|
VAX_ENCODING |
3 |
VAX
representation |
|
DECSTATION_ENCODING |
4 |
DECstation
representation |
|
SGi_ENCODING |
5 |
SGi
representation |
|
IBMPC_ENCODING |
6 |
IBM PC
representation |
|
IBMRS_ENCODING |
7 |
IBM RS-6000
representation |
|
MAC_ENCODING |
9 |
Macintosh
representation |
|
HP_ENCODING |
11 |
HP 9000
series representation |
|
NeXT_ENCODING |
12 |
NeXT
representation |
|
ALPHAOSF1_ENCODING |
13 |
DEC
Alpha/OSF1 representation |
|
ALPHAVMSd_ENCODING |
14 |
DEC
Alpha/OpenVMS representation. Double-precision
floating-point values in D_FLOAT encoding. |
|
ALPHAVMSg_ENCODING |
15 |
DEC
Alpha/OpenVMS representation. Double-precision
floating-point values in G_FLOAT encoding. |
|
ALPHAVMSi_ENCODING |
16 |
DEC
Alpha/OpenVMS representation. Single/Double-precision
floating-point values in IEEE 754
encoding. |
|
Data |
Data
Type(s) |
|||||
|
Encoding(s) |
CDF_BYTE CDF_INT1 CDF_UINT1 |
CDF_INT2 CDF_UINT2 |
CDF_INT4 CDF_UINT4 |
CDF_REAL4 CDF_FLOAT |
CDF_REAL8 CDF_DOUBLE CDF_EPOCH |
CDF_CHAR CDF_UCHAR |
|
NETWORK_ENCODING SUN_ENCODING NeXT_ENCODING MAC_ENCODING SGi_ENCODING IBMRS_ENCODING |
1-byte integer |
2-byte integer, big-endian |
4-byte
integer, big-endian |
IEEE
754 Single-precision
floating-point, big-endian |
IEEE
754 Double-precision
floating-point, big-endian |
ASCII
character set |
|
DECSTATION_ENCODING IBMPC_ENCODING ALPHAOSF1_ENCODING ALPHAVMSi_ENCODING |
1-byte integer |
2-byte integer, little-endian |
4-byte
integer, little-endian |
IEEE
754 Single-precision
floating-point, little-endian |
IEEE
754 Double-precision
floating-point, little-endian |
ASCII
character set |
|
VAX_ENCODING ALPHAVMSd_ENCODING |
1-byte integer |
2-byte integer, little-endian |
4-byte
integer, little-endian |
Digital’s F_FLOAT Single-precision
floating-point |
Digital’s D_FLOAT Double-precision
floating-point |
ASCII
character set |
|
ALPHAVMSg_ENCODING |
1-byte integer |
2-byte integer, little-endian |
4-byte
integer, little-endian |
Digital’s F_FLOAT Single-precision
floating-point |
Digital’s G_FLOAT Double-precision
floating-point |
ASCII
character set |
Table 5.11: Data Encodings vs. Data
Types
Single-Precision Floating-Point
This appendix
presents the exponent and mantissa values for a variety of single-precision
floating-point values using Digital's F_FLOAT and the IEEE 754 encoding. The sign bit is not shown but when the sign
bit is clear (0x0) the floating-point value is positive and when the sign bit
is set (0x1) the value is negative.
Section 5.1.4 illustrates how these exponent and mantissa values are
arranged in a particular single-precision floating-point value.
|
|
Digital’s
F_FLOAT |
IEEE
754 |
||
|
Value |
Exponent |
Mantissa |
Exponent |
Mantissa |
|
|
|
|
|
|
|
0.0000000000e+00 |
0x00 |
0x000000[26] |
0x00 |
0x000000 |
|
|
|
|
|
|
|
0.0000000000e+00 |
0x00 |
0x000001 |
|
|
|
0.0000000000e+00 |
0x00 |
0x000002 |
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
0.0000000000e+00 |
0x00 |
0x7FFFFE |
|
|
|
0.0000000000e+00 |
0x00 |
0x7FFFFF |
|
|
|
|
|
|
|
|
|
1.4012984643e-45 |
|
|
0x00 |
0x000001 |
|
2.8025969286e-45 |
|
|
0x00 |
0x000002 |
|
4.2038953930e-45 |
|
|
0x00 |
0x000003 |
|
5.6051938573e-45 |
|
|
0x00 |
0x000004 |
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
2.9387302719e-39 |
|
|
0x00 |
0x1FFFFC |
|
2.9387316732e-39 |
|
|
0x00 |
0x1FFFFD |
|
2.9387330745e-39 |
|
|
0x00 |
0x1FFFFE |
|
2.9387344758e-39 |
|
|
0x00 |
0x1FFFFF |
|
|
|
|
|
|
|
2.9387358771e-39 |
0x01 |
0x000000 |
0x00 |
0x200000 |
|
2.9387362274e-39 |
0x01 |
0x000001 |
|
|
|
2.9387365777e-39 |
0x01 |
0x000002 |
|
|
|
2.9387369280e-39 |
0x01 |
0x000003 |
|
|
|
2.9387372784e-39 |
0x01 |
0x000004 |
0x00 |
0x200001 |
|
2.9387376287e-39 |
0x01 |
0x000005 |
|
|
|
2.9387379790e-39 |
0x01 |
0x000006 |
|
|
|
2.9387383293e-39 |
0x01 |
0x000007 |
|
|
|
2.9387386797e-39 |
0x01 |
0x000008 |
0x00 |
0x200002 |
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
5.8774689515e-39 |
0x01 |
0x7FFFF8 |
0x00 |
0x3FFFFE |
|
5.8774693018e-39 |
0x01 |
0x7FFFF9 |
|
|
|
5.8774696522e-39 |
0x01 |
0x7FFFFA |
|
|
|
5.8774700025e-39 |
0x01 |
0x7FFFFB |
|
|
|
5.8774703528e-39 |
0x01 |
0x7FFFFC |
0x00 |
0x3FFFFF |
|
5.8774707031e-39 |
0x01 |
0x7FFFFD |
|
|
|
5.8774710535e-39 |
0x01 |
0x7FFFFE |
|
|
|
5.8774714038e-39 |
0x01 |
0x7FFFFF |
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
5.8774717541e-39 |
0x02 |
0x000000 |
0x00 |
0x400000 |
|
5.8774724548e-39 |
0x02 |
0x000001 |
|
|
|
5.8774731554e-39 |
0x02 |
0x000002 |
0x00 |
0x400001 |
|
5.8774738561e-39 |
0x02 |
0x000003 |
|
|
|
5.8774745567e-39 |
0x02 |
0x000004 |
0x00 |
0x400002 |
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
1.1754939304e-38 |
0x02 |
0x7FFFFA |
0x00 |
0x7FFFFD |
|
1.1754940005e-38 |
0x02 |
0x7FFFFB |
|
|
|
1.1754940706e-38 |
0x02 |
0x7FFFFC |
0x00 |
0x7FFFFE |
|
1.1754941406e-38 |
0x02 |
0x7FFFFD |
|
|
|
1.1754942107e-38 |
0x02 |
0x7FFFFE |
0x00 |
0x7FFFFF |
|
1.1754942808e-38 |
0x02 |
0x7FFFFF |
|
|
|
|
|
|
|
|
|
1.1754943508e-38 |
0x03 |
0x000000 |
0x01 |
0x000000 |
|
1.1754944910e-38 |
0x03 |
0x000001 |
0x01 |
0x000001 |
|
1.1754946311e-38 |
0x03 |
0x000002 |
0x01 |
0x000002 |
|
1.1754947712e-38 |
0x03 |
0x000003 |
0x01 |
0x000003 |
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
1.7014114290e+38 |
0xFF |
0x7FFFFC |
0xFD |
0x7FFFFC |
|
1.7014115304e+38 |
0xFF |
0x7FFFFD |
0xFD |
0x7FFFFD |
|
1.7014116318e+38 |
0xFF |
0x7FFFFE |
0xFD |
0x7FFFFE |
|
1.7014117332e+38 |
0xFF |
0x7FFFFF |
0xFD |
0x7FFFFF |
|
|
|
|
|
|
|
1.7014118346e+38 |
|
|
0xFE |
0x000000 |
|
1.7014120374e+38 |
|
|
0xFE |
0x000001 |
|
1.7014122403e+38 |
|
|
0xFE |
0x000002 |
|
1.7014124431e+38 |
|
|
0xFE |
0x000003 |
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
3.4028228579e+38 |
|
|
0xFE |
0x7FFFFC |
|
3.4028230607e+38 |
|
|
0xFE |
0x7FFFFD |
|
3.4028232636e+38 |
|
|
0xFE |
0x7FFFFE |
|
3.4028234664e+38 |
|
|
0xFE |
0x7FFFFF |
|
|
|
|
|
|
|
Infinity |
|
|
0xFF |
0x0000002 |
|
|
|
|
|
|
|
NaN |
|
|
0xFF |
0x000001[27] |
|
NaN |
|
|
0xFF |
0x000002[28] |
|
. |
|
|
|
|
|
. |
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
NaN |
|
|
0xFF |
0x7FFFFF3 |
|
NaN |
|
|
0xFF |
0x7FFFFF3 |
Note that not
all single-precision floating-point values can be represented in both
encodings. Several ranges
of floating-point
values, as well as some individual values, are of interest...
0.0000000000e+00
When
an F_FLOAT value has an exponent of 0x00, the floating-point value represented
is 0.0000000000e+00 regardless of the value of the mantissa.
1.4012984643e-45
through 2.9387344758e-39
These
values can only be represented with the IEEE 754 encoding. Their magnitudes are too small for the
F_FLOAT encoding.
2.9387358771e-39
through 5.8774714038e-39
The
F_FLOAT encoding has more precision in this range. Four times as many F_FLOAT values fall into this range as do IEEE
754 values.
5.8774717541e-39
through 1.1754942808e-38
The
F_FLOAT encoding also has more precision in this range. Twice as many F_FLOAT values fall into this
range as do IEEE 754 values.
1.1754943508e-38
through 1.7014117332e+38
The
F_FLOAT and IEEE 754 encodings have equal precision through this range.
1.7014118346e+38
through 3.4028234664e+38
These
values can only be represented with the IEEE 754 encoding. Their magnitudes are too large for the F_FLOAT
encoding.
Infinity
This
value exists only in the IEEE 754 encoding.
NaN
Not
a number. These non-values exist only
in the IEEE 754 encoding.
Double-Precision Floating-Point
This appendix
presents the exponent and mantissa values for a variety of double-precision
floating-point values using Digital's G_FLOAT, Digital's D_FLOAT, and the IEEE
754 encoding. The sign bit is not shown
but when the sign bit is clear (0x0) the floating-point value is positive and
when the sign bit is set (0x1) the value is negative. Section 5.1.4 illustrates how these exponent and mantissa values
are arranged in a particular double-precision floating-point value.
|
|
Digital's G_FLOAT |
Digital's G_FLOAT |
IEEE 754 |
||||
|
Value |
Exponent |
Mantissa |
Exponent |
Mantissa |
Exponent |
Mantissa |
|
|
|
|
|
|
|
|
|
|
|
0.00000000000000000e+000 |
0x000 |
0x00000000000000[29] |
0x000 |
0x00000000000000 |
0x000 |
0x00000000000000 |
|
|
|
|
|
|
|
|
|
|
|
0.00000000000000000e+000 |
0x000 |
0x00000000000001 |
0x000 |
0x00000000000001[30] |
|
|
|
|
0.00000000000000000e+000 |
0x000 |
0x00000000000002 |
0x000 |
0x00000000000002 |
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0.00000000000000000e+000 |
0x000 |
0xFFFFFFFFFFFFE |
0x000 |
0x7FFFFFFFFFFFFE |
|
|
|
|
0.00000000000000000e+000 |
0x000 |
0xFFFFFFFFFFFFF |
0x000 |
0x7FFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
|
|
4.94065645841246544e-324 |
|
|
|
|
0x000 |
0x00000000000001 |
|
|
9.88131291682493088e-324 |
|
|
|
|
0x000 |
0x00000000000002 |
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5.56268464626799358e-309 |
|
|
|
|
0x000 |
0x3FFFFFFFFFFFE |
|
|
5.56268464626799852e-309 |
|
|
|
|
0x000 |
0x3FFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
5.56268464626800346e-309 |
0x001 |
0x0000000000000 |
|
|
0x000 |
0x4000000000000 |
|
|
5.56268464626800469e-309 |
0x001 |
0x0000000000001 |
|
|
|
|
|
|
5.56268464626800593e-309 |
0x001 |
0x0000000000002 |
|
|
|
|
|
|
5.56268464626800716e-309 |
0x001 |
0x0000000000003 |
|
|
|
|
|
|
5.56268464626800840e-309 |
0x001 |
0x0000000000004 |
|
|
0x000 |
0x4000000000001 |
|
|
5.56268464626800963e-309 |
0x001 |
0x0000000000005 |
|
|
|
|
|
|
5.56268464626801087e-309 |
0x001 |
0x0000000000006 |
|
|
|
|
|
|
5.56268464626801210e-309 |
0x001 |
0x0000000000007 |
|
|
|
|
|
|
5.56268464626801334e-309 |
0x001 |
0x0000000000008 |
|
|
0x000 |
0x4000000000002 |
|
|
|
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.11253692925359970e-308 |
0x001 |
0xFFFFFFFFFFFF8 |
|
|
0x000 |
0x7FFFFFFFFFFFE |
|
|
1.11253692925359983e-308 |
0x001 |
0xFFFFFFFFFFFF9 |
|
|
|
|
|
|
1.11253692925359995e-308 |
0x001 |
0xFFFFFFFFFFFFA |
|
|
|
|
|
|
1.11253692925360007e-308 |
0x001 |
0xFFFFFFFFFFFFB |
|
|
|
|
|
|
1.11253692925360020e-308 |
0x001 |
0xFFFFFFFFFFFFC |
|
|
0x000 |
0x7FFFFFFFFFFFF |
|
|
1.11253692925360032e-308 |
0x001 |
0xFFFFFFFFFFFFD |
|
|
|
|
|
|
1.11253692925360044e-308 |
0x001 |
0xFFFFFFFFFFFFE |
|
|
|
|
|
|
1.11253692925360057e-308 |
0x001 |
0xFFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.11253692925360069e-308 |
0x002 |
0x0000000000000 |
|
|
0x000 |
0x8000000000000 |
|
|
1.11253692925360094e-308 |
0x002 |
0x0000000000001 |
|
|
|
|
|
|
1.11253692925360119e-308 |
0x002 |
0x0000000000002 |
|
|
0x000 |
0x8000000000001 |
|
|
1.11253692925360143e-308 |
0x002 |
0x0000000000003 |
|
|
|
|
|
|
1.11253692925360168e-308 |
0x002 |
0x0000000000004 |
|
|
0x000 |
0x8000000000002 |
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.22507385850719990e-308 |
0x002 |
0xFFFFFFFFFFFFA |
|
|
0x000 |
0xFFFFFFFFFFFFD |
|
|
2.22507385850720015e-308 |
0x002 |
0xFFFFFFFFFFFFB |
|
|
|
|
|
|
2.22507385850720039e-308 |
0x002 |
0xFFFFFFFFFFFFC |
|
|
0x000 |
0xFFFFFFFFFFFFE |
|
|
2.22507385850720064e-308 |
0x002 |
0xFFFFFFFFFFFFD |
|
|
|
|
|
|
2.22507385850720089e-308 |
0x002 |
0xFFFFFFFFFFFFE |
|
|
0x000 |
0xFFFFFFFFFFFFF |
|
|
2.22507385850720114e-308 |
0x002 |
0xFFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.22507385850720138e-308 |
0x003 |
0x0000000000000 |
|
|
0x001 |
0x0000000000000 |
|
|
2.22507385850720188e-308 |
0x003 |
0x0000000000001 |
|
|
0x001 |
0x0000000000001 |
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.93873587705571812e-039 |
0x380 |
0xFFFFFFFFFFFFE |
|
|
0x37E |
0xFFFFFFFFFFFFE |
|
|
2.93873587705571844e-039 |
0x380 |
0xFFFFFFFFFFFFF |
|
|
0x37E |
0xFFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
2.93873587705571877e-039 |
0x381 |
0x0000000000000 |
0x001 |
0x00000000000000 |
0x37F |
0x0000000000000 |
|
|
2.93873587705571885e-039 |
|
|
0x001 |
0x00000000000001 |
|
|
|
|
2.93873587705571893e-039 |
|
|
0x001 |
0x00000000000002 |
|
|
|
|
2.93873587705571901e-039 |
|
|
0x001 |
0x00000000000003 |
|
|
|
|
2.93873587705571910e-039 |
|
|
0x001 |
0x00000000000004 |
|
|
|
|
2.93873587705571918e-039 |
|
|
0x001 |
0x00000000000005 |
|
|
|
|
2.93873587705571926e-039 |
|
|
0x001 |
0x00000000000006 |
|
|
|
|
2.93873587705571934e-039 |
|
|
0x001 |
0x00000000000007 |
|
|
|
|
2.93873587705571942e-039 |
0x381 |
0x0000000000001 |
0x001 |
0x00000000000008 |
0x37F |
0x0000000000001 |
|
|
2.93873587705571950e-039 |
|
|
|
0x00000000000009 |
|
|
|
|
2.93873587705571959e-039 |
|
|
|
0x0000000000000A |
|
|
|
|
2.93873587705571967e-039 |
|
|
|
0x0000000000000B |
|
|
|
|
2.93873587705571975e-039 |
|
|
|
0x0000000000000C |
|
|
|
|
2.93873587705571983e-039 |
|
|
|
0x0000000000000D |
|
|
|
|
2.93873587705571991e-039 |
|
|
|
0x0000000000000E |
|
|
|
|
2.93873587705571999e-039 |
|
|
|
0x0000000000000F |
|
|
|
|
2.93873587705572007e-039 |
0x381 |
0x0000000000002 |
|
0x00000000000010 |
0x37F |
0x0000000000020 |
|
|
2.93873587705572016e-039 |
|
|
|
0x00000000000011 |
|
|
|
|
2.93873587705572024e-039 |
|
|
|
0x00000000000012 |
|
|
|
|
2.93873587705572032e-039 |
|
|
|
0x00000000000013 |
|
|
|
|
2.93873587705572040e-039 |
|
|
|
0x00000000000014 |
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5.87747175411143623e-039 |
0x381 |
0xFFFFFFFFFFFFE |
0x001 |
0x7FFFFFFFFFFFF0 |
0x37F |
0xFFFFFFFFFFFFE |
|
|
5.87747175411143632e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF1 |
|
|
|
|
5.87747175411143640e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF2 |
|
|
|
|
5.87747175411143648e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF3 |
|
|
|
|
5.87747175411143656e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF4 |
|
|
|
|
5.87747175411143664e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF5 |
|
|
|
|
5.87747175411143672e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF6 |
|
|
|
|
5.87747175411143681e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF7 |
|
|
|
|
5.87747175411143689e-039 |
0x381 |
0xFFFFFFFFFFFFF |
0x001 |
0x7FFFFFFFFFFFF8 |
0x37F |
0xFFFFFFFFFFFFF |
|
|
5.87747175411143697e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFF9 |
|
|
|
|
5.87747175411143705e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFFA |
|
|
|
|
5.87747175411143713e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFFB |
|
|
|
|
5.87747175411143721e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFFC |
|
|
|
|
5.87747175411143730e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFFD |
|
|
|
|
5.87747175411143738e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFFE |
|
|
|
|
5.87747175411143746e-039 |
|
|
0x001 |
0x7FFFFFFFFFFFFF |
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.70141183460469182e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFEB |
|
|
|
|
1.70141183460469185e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFEC |
|
|
|
|
1.70141183460469187e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFED |
|
|
|
|
1.70141183460469189e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFEE |
|
|
|
|
1.70141183460469192e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFEF |
|
|
|
|
1.70141183460469194e+038 |
0x47F |
0xFFFFFFFFFFFFE |
0x0FF |
0x7FFFFFFFFFFFF0 |
0x47D |
0xFFFFFFFFFFFFE |
|
|
1.70141183460469196e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF1 |
|
|
|
|
1.70141183460469199e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF2 |
|
|
|
|
1.70141183460469201e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF3 |
|
|
|
|
1.70141183460469203e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF4 |
|
|
|
|
1.70141183460469206e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF5 |
|
|
|
|
1.70141183460469208e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF6 |
|
|
|
|
1.70141183460469210e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF7 |
|
|
|
|
1.70141183460469213e+038 |
0x47F |
0xFFFFFFFFFFFFE |
0x0FF |
0x7FFFFFFFFFFFF8 |
0x47D |
0xFFFFFFFFFFFFF |
|
|
1.70141183460469215e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFF9 |
|
|
|
|
1.70141183460469218e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFFA[31] |
|
|
|
|
1.70141183460469220e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFFB |
|
|
|
|
1.70141183460469222e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFFC |
|
|
|
|
1.70141183460469225e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFFD |
|
|
|
|
1.70141183460469227e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFFE |
|
|
|
|
1.70141183460469229e+038 |
|
|
0x0FF |
0x7FFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
|
|
1.70141183460469232e+038 |
0x480 |
0x0000000000000 |
|
|
0x47E |
0x0000000000000 |
|
|
1.70141183460469270e+038 |
0x480 |
0x0000000000001 |
|
|
0x47E |
0x0000000000001 |
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8.98846567431157754e+307 |
0x7FF |
0xFFFFFFFFFFFFE |
|
|
0x7FD |
0xFFFFFFFFFFFFE |
|
|
8.98846567431157854e+307 |
0x7FF |
0xFFFFFFFFFFFFF |
|
|
0x7FD |
0xFFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
8.98846567431157954e+307 |
|
|
|
|
0x7FE |
0x0000000000000 |
|
|
8.98846567431158153e+307 |
|
|
|
|
0x7FE |
0x0000000000001 |
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.79769313486231551e+308 |
|
|
|
|
0xF7E |
0xFFFFFFFFFFFFE |
|
|
1.79769313486231571e+308 |
|
|
|
|
0xF7E |
0xFFFFFFFFFFFFF |
|
|
|
|
|
|
|
|
|
|
|
Infinity |
|
|
|
|
0xFFF |
0x0000000000000[32] |
|
|
|
|
|
|
|
|
|
|
|
NaN |
|
|
|
|
0xFFF |
0x0000000000001[33] |
|
|
NaN |
|
|
|
|
0xFFF |
0x0000000000002 |
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NaN |
|
|
|
|
0xFFF |
0xFFFFFFFFFFFFE |
|
|
NaN |
|
|
|
|
0xFFF |
0xFFFFFFFFFFFFF |
|
Note that not
all double-precision floating-point values can be represented in all
encodings. Several ranges of
floating-point values, as well as some individual values, are of interest...
0.0000000000e+00
When
a G_FLOAT or D_FLOAT value has an exponent of 0x00, the floating-point value
represented is 0.00000000000000000e+00 regardless of the value of the mantissa.
4.94065645841246544e-324
through 5.56268464626799852e-309
These
values can only be represented with the IEEE 754 encoding. Their magnitudes are too small for the
G_FLOAT and D_FLOAT encodings.
5.56268464626800346e-309
through 1.11253692925360057e-308
These
values can only be represented with the G_FLOAT and IEEE 754 encodings. Their magnitudes are too small for the
D_FLOAT encoding. In this range the
G_FLOAT encoding has more precision than the IEEE 754 encoding. Four times as many G_FLOAT values fall into
this range as do IEEE 754 values.
1.11253692925360069e-308
through 2.22507385850720114e-308
These
values can only be represented with the G_FLOAT and IEEE 754 encodings. Their magnitudes are too small for the
D_FLOAT encoding. In this range the
G_FLOAT encoding has more precision than the IEEE 754 encoding. Twice as many G_FLOAT values fall into this
range as do IEEE 754 values.
2.22507385850720138e-308
through 2.93873587705571844e-039
These
values can only be represented with the G_FLOAT and IEEE 754 encodings. Their magnitudes are too small for the
D_FLOAT encoding. In this range the G_FLOAT and IEEE 754 encodings have equal
precision.
2.93873587705571877e-039
through 1.70141183460469229e+038
Through
this range the D_FLOAT encoding has more precision. Eight times as many D_FLOAT values fall into this range as do
G_FLOAT or IEEE 754 values. The G_FLOAT
and IEEE 754 encodings have equal precision through this range.
1.70141183460469232e+038
through 8.98846567431157854e+307
These
values can only be represented with the G_FLOAT and IEEE 754 encodings. Their magnitudes are too large for the
D_FLOAT encoding. In this range the
G_FLOAT and IEEE 754 encodings have equal precision.
8.98846567431157954e+307
through 1.79769313486231571e+308
These
values can only be represented with the IEEE 754 encoding. Their magnitudes are too large for the
G_FLOAT and D_FLOAT encodings.
Infinity
This
value exists only in the IEEE 754 encoding.
NaN
Not
a number. These non-values exist only
in the IEEE 754 encoding.
[1] On a Macintosh only the data fork of a file is used in a dotCDF or variable file.
[2] The offset in (hexadecimal) bytes from the beginning of the internal record.
[3] The offset in (hexadecimal) bytes from the beginning of the file.
[4] They don't seem like magic to me but looking at these values is how you would determine the identity of a file.
[5] Pre-V2.6, it is 0x0000FFFF.
[6] That means an uncompressed CDF or a CDF with a selected variable(s) compressed
[7] Compression is not available for
Pre-V2.6 CDFs. For Pre-V2.6, it is
0x0000FFFF, repeated from the first number.
The magic numbers for V2.7 are identical to V2.6.
[8] Well, sort of a copyright.
[9] Much of which was space reserved for future use. That future use never occurred.
[10] Because the only difference between AgrEDRs and AzEDRs is the value of the RecordType field, they will be referred to as AEDRs throughout this document.
[11] Note that prior to CDF V2.2 this only applies to AgrEDRs because zEntries were not yet supported.
[12] The term VDR is used when something applies to both rVDRs and zVDRs. The terms rVDR and zVDR will be used when a distinction must be made.
[13] With the exceptions for rVariables being noted.
[14] Note that prior to CDF V2.2 this only applies to rVDRs because zVariables were not yet supported.
[15] Due to a huge memory requirement, the GZIP compression is disabled for the PCs running the 16-bit DOS/Windows 3.x.
[16] On VMS and DOS systems, the file names/extensions would be uppercase.
[17] The Institute of Electrical and Electronics Engineers, Inc.
[18] Digital Equipment Corporation
[19] An exception to this would be the indexing
statistics provided to an application by the CDF library for variables in
asingle-file CDF.
[20] The ASCII NUL character (an integer value of 0x00).
[21] CDF_BYTE values are equivalent to CDF_INT1 values.
[22] CDF_FLOAT values are equivalent to CDF_REAL4 values.
[23] CDF_DOUBLE values are equivalent to CDF_REAL8 values.
[24] CDF_EPOCH values are equivalent to CDF_REAL8 values. CDF_EPOCH is used to store date/time values (as the number of milliseconds since 1-Jan-0000 00:00:00.000).
[25] Both signed and unsigned character data types are provided for applications that may want to distinguish between the two. Note that attribute entries and variable values of this type are never NUL-terminated.
[26] If the sign bit is set (-0.0), a %SYSTEM-F-ROPRAnD fatal error (on VAXes running VMS/OpenVMS) or a %SYSTEM-F-HPARITH fatal error (on DEC Alphas running OpenVMS) will occur if the value is used.
[27] -Infinity if the sign bit is set.
[28] -NaN if the sign bit is set.
[29] If the sign bit is set (-0.0), a %SYSTEM-F-ROPRAnD fatal error (on VAXes running VMS/OpenVMS) or a %SYSTEM-F-HPARITH fatal error (on DEC Alphas running OpenVMS) will occur if the value is used.
[30] Even if the sign bit is clear, a %SYSTEM-F-HPARITH fatal error will occur if the value is used on a DEC Alpha running OpenVMS.
[31] 3If the sign bit is set or clear, a %SYSTEM-F-HPARITH fatal error will occur if the value is used on a DEC Alpha running OpenVMS.
[32] -Infinity if the sign bit is set.
[33] -NaN if the sign bit is set.