Oracle® Solaris Studio 12.4:数值计算指南

退出打印视图

更新时间: 2015 年 1 月
 
 

2.2.7 Oracle Solaris 环境中的基数转换

基数转换指将在一个基数中表示的数字转换为在另一个基数中表示的数字。 C 中的 printfscanf 以及 Fortran 中的 readwriteprint 等 I/O 例程都涉及到用基数 2 和基数 10 表示的数字间的转换:

  • 当读取用传统十进制表示法表示的数字并将其用内部二进制格式存储时,就会执行从基数 10 到基数 2 的转换。

  • 将内部二进制值作为十进制 ASCII 字符串打印时,系统会执行从基数 2 到基数 10 的转换。

在 Oracle Solaris 环境中,供所有语言使用的基数转换基础例程包含在标准 C 库 libc 中。这些例程使用表驱动算法,这种算法可以在输入格式和输出格式之间实现正确舍入的转换(服从对所涉及的十进制数字字符串长度的适当限制)。除了其精确度外,表驱动算法还减少了正确舍入基数转换出现最差情况的次数。

1985 IEEE 标准要求对数量级从 10–44 到 10+44 的一般数字要正确舍入,而对更大的指数则允许微小差别的舍入。请参见 IEEE 标准 754 的 5.6 节。libc 表驱动算法可以对整个范围的单精度、双精度和双精度扩展格式进行正确的舍入,如修改后的 754-2008 要求的那样。

在 C 中,根据 IEEE 754,总是可以对十进制字符串与二进制浮点值之间的转换进行正确舍入:转换后的结果是结果的格式可以表示的数字,在当前舍入模式指定的方向下,它与原值最接近。当舍入模式是舍入到最接近值并且原值位于两个可用结果格式表示的数字的正中间时,则转换后结果的最低有效位数字是偶数。这些规则适用于编译器执行的源代码中的常数转换,也适用于程序使用标准库例程执行的数据转换。

在 Fortran 中,可以根据与 C 缺省设置相同的规则,对十进制字符串和二进制浮点值进行正确的舍入。对于 I/O 转换,可以使用程序中的 ROUNDING= 说明符或利用 –iorounding 标志编译,覆盖舍入到最接近模式中的“舍入到偶数”规则。有关详细信息,请参见Oracle Solaris Studio 12.4:Fortran 用户指南 f95(1) 手册页。

有关基数转换的参考信息,请参见Appendix F, 参考资料 ,尤其是 Coonen 的论文和 Sterbenz 的书。