Oracle® Solaris Studio 12.4:C 用户指南

退出打印视图

更新时间: 2014 年 12 月
 
 

2.19.2 十进制浮点内部函数

SPARC64X 和 SPARC64X+ 支持十进制浮点数据类型和运算。数据格式符合 IEEE 754-2008 中定义的 64 位 DPD。编译器提供了用于处理数据的类型和多个函数。

2.19.2.1 类型和运算

要表示十进制浮点数,请在 dpd_conf.h 中声明 _Decimal64 内部函数类型。您必须在使用该类型之前包括头文件,如以下示例所示:

#include <dpd_conf.h>
int main(void) {
  _Decimal64 dd;
  ...
  return 0;
}

_Decimal64 类型

  • 可使用类型修饰符进行修改:const 和/或 volatile

  • 可使用存储类说明符进行指定:autostaticregisterextern 和/或 typedef

  • 可以是聚集的元素:arraystruct 和/或 union

_Decimal64 类型变量

  • 可以是函数的正式参数。

  • 可以是函数调用的实际参数。

  • 可以是函数的返回值。

  • 可以是赋值操作符 "=" 的 lhs 或 rhs。

  • 可以是地址运算符 "&" 的操作数。

  • 可以是 sizeof 运算符的操作数。

  • 可以是 typeof 运算符的操作数。

会为其他运算(例如,算术、比较或类型转换)提供内部函数。

_Decimal64 的文本字符串语法不受支持。请改用类型转换的内部函数。

_Decimal64 类型数据与 64 位二进制浮点数的内存对齐相同。

2.19.2.2 宏和 pragma

指定 -xarch=[sparcace|sparcaceplus] 和 -m64 时,__DEC_FP_INTR 宏定义为 1。该宏在确定编译器是否支持十进制浮点内部函数功能时非常有用。

包括 dpd_conf.h 时,IEEE 754-2008 所需的 DEC_EVAL_METHOD 宏定义为 1。

__STDC_DEC_FP__ 宏并未定义,因为该编译器不完全支持 ISO/IEC TR 24732 中所述的功能。

IEEE 754-2008 所需的 #pragma FLOAT_CONST_DECIMAL_64 受支持。

2.19.2.3 内部函数

dpd_conf.h 中声明了下面所列的内部函数。它们在处理 _Decimal64 类型的变量时非常有用。

void __dpd64_store(const _Decimal64 src, _Decimal64 * const addr)

此函数将 src 存储到由 addr 寻址的内存中。addr 必须在 8 字节边界上对齐,否则无论 -xmemalign 设置为何都不会定义行为。

_Decimal64 __dpd64_load(const _Decimal64 * const addr)

该函数将从由 addr 寻址的内存中加载 _Decimal64 类型的值并返回该值。addr 必须在 8 字节边界上对齐,否则无论 -xmemalign 设置为何都不会定义行为。

_Decimal64 __dpd64_add(_Decimal64 src1, _Decimal64 src2)

该函数将添加 src1src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_sub(_Decimal64 src1, _Decimal64 src2)

此函数将从 src1 中减去 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_mul(_Decimal64 src1, _Decimal64 src2)

该函数将 src1src2 相乘并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_div(_Decimal64 src1, _Decimal64 src2)

此函数将用 src1 除以 src2 并返回结果。根据 IEEE 754-2008 标准抛出浮点异常。

_Decimal64 __dpd64_abs(_Decimal64 src)

此函数将计算 src 的绝对值并返回结果。即使 src 发出 NaN 信号,也不会抛出浮点异常。

_Decimal64 __dpd64_neg(_Decimal64 src)

此函数将保留 src 的符号并返回结果。即使 src 发出 NaN 信号,也不会抛出浮点异常。

int __dpd64_cmpeq(_Decimal64 src1, _Decimal64 src2)

src1 等于 src2 时,此函数会返回非 0 值,否则将返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmpne(_Decimal64 src1, _Decimal64 src2)

src1 不等于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmpgt(_Decimal64 src1, _Decimal64 src2)

src1 大于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmpge(_Decimal64 src1, _Decimal64 src2)

src1 大于或等于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmplt(_Decimal64 src1, _Decimal64 src2)

src1 小于 src2 时,此函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

int __dpd64_cmple(_Decimal64 src1, _Decimal64 src2)

src1 小于或等于 src2 时,该函数返回非 0 值,否则返回 0。对 NaN、Inf 和负零值的处理符合 IEEE 754-2008。

_Decimal64 __dpd64_convert_from_int64(int64_t src)

此函数将 src 中的 64 位带符号整数值转换为十进制浮点值并返回结果。

_Decimal64 __dpd64_convert_from_uint64(uint64_t src)

此函数将 src 中的 64 位无符号整数值转换为十进制浮点值并返回结果。

_Decimal64 __dpd64_convert_from_double(double src)

此函数将 src 中的二进制浮点值转换为十进制浮点值并返回结果。

int64_t __dpd64_convert_to_int64(_Decimal64 src)

此函数将 src 中的十进制浮点值转换为 64 位带符号整数值并返回结果。

uint64_t __dpd64_convert_to_uint64(_Decimal64 src)

此函数会将 src 中的十进制浮点值转换为 64 位无符号整数值并返回结果。

double __dpd64_convert_to_double(_Decimal64 src)

此函数将 src 中的十进制浮点值转换为二进制浮点值并返回结果。

int __dpd_getround(void)

此函数检索 _Decimal64 的当前舍入模式。该值在 dpd_conf.h 中进行定义,如下所示:

__DPD_ROUND_NEAREST

舍入到最接近的,偶数优先

__DPD_ROUND_TOZERO

舍入到零

__DPD_ROUND_POSITIVE

舍入到正无穷大

__DPD_ROUND_NEGATIVE

舍入到负无穷大

__DPD_ROUND_NEARESTFROMZERO

舍入到最接近的,远离零

_Decimal64 的舍入模式的初始值为 __DPD_ROUND_NEAREST。请注意,-fround 选项不改变 _Decimal64 的舍入模式。

int __dpd_setround(int r)

此函数会将 _Decimal64 的舍入模式设置为 rr 应为上面所列的值之一。它在成功时返回 0,在失败时返回非 0。