Oracle Solaris Studio 12.4 Man Pages

Exit Print View

Updated: January 2015
 
 

convert_external(3M)

Name

convert_external - 转换外部二进制数据格式

Synopsis

cc [ flag ... ] file ...  -lsunmath -lm [ library ... ]
#include <sunmath.h>
 
enum convert_external_arch_t = {
     convert_external_sparc, convert_external_pc,
     convert_external_vax, convert_external_vaxg,
     convert_external_s370, convert_external_cray };

enum convert_external_type_t = {
     convert_external_signed,
     convert_external_unsigned,
     convert_external_float };

enum convert_external_rounding_t = {
     convert_external_common = -1,
     convert_external_biased = -2,
     convert_external_away = -3 };

typedef struct {
     enum convert_external_arch_t arch ;     /* format architecture */
     enum convert_external_type_t type ;     /* format type */
     int size ;                    /* format size in 8-bit bytes */
     } convert_external_t ;

fp_exception_field_type convert_external(const char *src_p,
     convert_external_t src_format, char *dst_p,
     convert_external_t dst_format, int rounding, int n);
fp_exception_field_type convert_external_(const char *src_p,
     const convert_external_t *src_format_p, char *dst_p,
     const convert_external_t *dst_format_p, const int *rounding_p,
     const int *n_p);

Description

在 C 程序中使用 convert_external() 在非 SPARC 系统上的二进制数据与 SPARC 二进制数据之间相互转换。数据可以是有符号整数、无符号整数或者浮点数据。在 Fortran 程序 (CALL CONVERT_EXTERNAL(...)) 中使用 convert_external_() 达到相同目的,所有参数通过引用调用。

convert_external_t 类型描述支持的格式;对于每种体系结构,都支持大小为 1、2、4、8 或 16 字节的有符号和无符号整数以及大小为 4、8、10、12 或 16 字节的浮点类型。如果为源或目标指定的大小不恰当,则不会发生转换,并返回 (1<<fp_division),其他情况不会引发该异常。

支持的体系结构和格式包括

external_t  endian-   float*4   float*8   float*10   float*12   float*16
architec-    ness     format    format     format     format     format
  ture

sparc        big      IEEE      IEEE       none     MC68881      IEEE
                     single    double               extended     quad
pc         little     IEEE      IEEE      i80x87    i80960KB     IEEE
                     single    double    extended   extended     quad
vax        little     VAX F     VAX D      none       none      VAX H
vaxg       little     VAX F     VAX G      none       none      VAX H
s370         big      S/370     S/370      none       none      S/370
                     single    double                          extended
cray         big      none     Cray-1      none       none      Cray-1
                               single                           double

请注意,MC68000 和 SPARC 格式是完全相同的大尾数法格式;8086/8087、80x86/7 和 80486 的 Intel PC 格式是完全相同的小尾数法格式。表条目 "none'' 代表大小不恰当;未发生转换。"IEEE quad" 是指 IEEE 单精度和双精度的自然大尾数法或小尾数法扩展,扩展后的格式有 15 个指数位、一个隐式有效位和 112 个显式有效位。

Usage

 
excep = convert_external(src_p, src_format, dst_p, dst_format,
     rounding, n);
excep

该函数值是在转换过程中遇到的所有异常的累加。如果检测单个异常很重要,则 n 应为 1,以便一次仅转换一个数据项。

src_p

作为连续数组存储的要转换的数据的指针。该指针被声明为 char * 以强调没有对齐要求,但转换为 SPARC 格式供同一个程序后续处理的数据应进行相应的对齐。

dst_p

作为连续数组存储的已转换数据的指针。

src_format

对源数据格式的说明。

dst_format

对目标数据格式的说明。

rounding

要应用于目标数据的舍入模式。

n

要转换的数据项数量。

舍入选项;第一个几乎适用于所有应用程序:

(int) convert_external_common

整数和无符号的目标格式向零方向舍入(2.9 舍入为 2,-2.9 舍入为 -2),IEEE 浮点目标舍入到最接近的无偏数,VAX 浮点目标舍入到最接近的有偏数,IBM 370 和 Cray 浮点目标向零方向舍入。

(int) convert_external_biased

舍入到最接近的有偏数(对于整数目标,1.5 舍入到 2,2.5 舍入到 3)。

(int) convert_external_away

向远离零的方向舍入(对于整数目标,2.1 舍入到 3,-2.1 舍入到 -3)。

(int) fp_nearest、fp_tozero、fp_positive、fp_negative

在 IEEE 754 中指定的模式之一中获取舍入。

在转换之后,如果 (excep & (1 << fp_invalid)) != 0,则将发生一个或多个无效异常;对于以此方式定义的其他异常,情况类似:

fp_invalid

输入参数是 IEEE 信令 NaN 或 VAX 保留操作数,或者输入参数是无穷大并且目标是整数或无符号类型,或者不含无穷大表示形式的浮点类型。

fp_overflow

输入参数是有限的较大数,但无法以目标格式表示,仅有正常舍入错误;如果目标格式是整数或无符号,则 fp_overflow 表示整数溢出。

fp_underflow

输入参数是有限的较小数,并且无法以目标格式表示,仅有正常舍入错误。只有浮点目标才可能发生这种情况。

fp_inexact

输入参数有限,但无法完全以目标格式显示。

fp_division

不支持源格式或目标格式。未进行任何转换。

请注意,将外部数据转换为 SPARC 格式、在 SPARC 上处理后再转换回外部格式所得到的结果,几乎总是与完全在外部系统上处理数据的结果不同,即使转换和处理在 SPARC 没有发生任何异常时也是如此。

Examples

在外部系统上生成数据

以下代码演示了 Fortran 在外部系统上生成二进制浮点数据的典型过程:

 
REAL A(100)
WRITE(9) A

将外部数据转换为 C 中的 SPARC 内部形式

假设上一个二进制数据文件是在 Cray 上的磁带中创建的,是在 SPARC 系统上读取的。要转换为 IEEE 双精度浮点格式,但使用有偏舍入,

 
#include <sunmath.h>

char datasrc[800];
double datadest[100];
fp_exception_field_type excep;
int rounding;
int i;
convert_external_t src, dest;

/*    read the Cray data into the array datasrc somehow, then ...  */

src.arch = convert_external_cray;
src.type = convert_external_float;
src.size = 8;
dest.arch = convert_external_sparc;
dest.type = convert_external_float;
dest.size = 8;
rounding = convert_external_biased;

excep = convert_external((char *) datasrc, src, (char *) datadest, 
     dest, rounding, 100);

/*
 * usually you are not interested in inexact exceptions
 * and you'd do this
 */
 excep &= ~(1 << fp_inexact);

 /*
  * other exceptions are possible in this example - after the fact,
  * you can find out where they happened this way
  */
 if (excep != 0) for (i = 0 ; i < 100 ; i++) {
     excep = convert_external((char *)&datasrc[8 * i], src,
          (char *)&datadest[i], dest, rounding, 1);
     if (excep != 0) {
         /* do something specific about datadest[i] */
     }
 }

将 SPARC 内部数据转换为 Fortran 中的外部形式

假设要将在 SPARC 程序中创建的数据读取到 IBM PC 中。要转换,

 
#include <floatingpoint.h>

        REAL*4 datasrc(100)
        REAL*4 datadest(100)
        INTEGER excep, convert_external, round
        INTEGER src(4), dest(4)

c        create datasrc array somehow, then ...

        src(1) = convert_external_sparc
        src(2) = convert_external_float
        src(3) = 4
        dest(1) = convert_external_pc
        dest(2) = convert_external_float
        dest(3) = 4
        round = convert_external_common

        excep = convert_external(datasrc, src, datadest, dest, round,
                   100);
c        The only exception that can arise is fp_invalid,
c        by converting a signaling NaN.

c        Now write the data out in a file that an IBM PC can read
          

Attributes

有关下列属性的说明,请参见 attributes(5):

属性类型
属性值
接口稳定性
Committed(已确定)
MT 级别
MT-Safe(MT 安全)

See also

dd (1M) 用于从外部系统读取磁带; xdr (3NSL) 用于以独立于计算机的方式设置任意数据结构的格式。

Notes

一次执行一个转换:将源数据转换为足以完全存放任何输入的内部格式,然后将内部数据转换为目标形式。这样,将允许任何源和目标格式对,但效率不如为特定格式间转换而写的程序高。