当前位置: C语言 -- 标准库 -- <math.h> -- canonicalized64

canonicalized64函数


概要:
#include <math.h>
#ifdef __STDC_IEC_60559_DFP__
    int canonicalized64(_Decimal64 *cx, const _Decimal64 *x);
#endif 

描述:

浮点类型的首选表示形式称为规范表示(canonical representations);浮点类型也可以包含非规范表示(non-canonical representations);通常情况下浮点运算结果采用规范表示。

该函数尝试将参数x指向对象中的浮点表示转换为规范版本(如同转换为指定类型的临时对象。),然后将规范结果存储到参数cx指向的对象中。参数x和参数cx可以指向同一对象。

如果*x是信号非数值(signaling NaN),该函数将规范的安静非数值(quiet NaN)存储到参数cx指向的对象中。

如果未生成规范结果,参数cx指向的对象保持不变。


参数:
_Decimal64 *cx

参数为指向_Decimal64类型对象的指针。

const _Decimal64 *x

参数为指向const _Decimal64类型对象的指针。


返回值:

如果规范结果存储到参数cx指向的对象中,函数返回0;否则返回非0值。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
/*函数canonicalized64范例*/

#include <float.h>
#include <math.h>
#include <stdio.h>
#include <string.h>

int main(void)
{
    #if __STDC_VERSION_MATH_H__ >= 202311L && defined(__STDC_IEC_60559_DFP__)
        _Decimal64 cx = 0.0dd;
        const _Decimal64 x = DEC64_SNAN;
        size_t size = sizeof(_Decimal64);
        unsigned char arr[size];

        if(canonicalized64(&cx, &x) == 0)
        {
            memcpy(arr, &cx, size);

            for(size_t i=0; i<size; i++)
            {
                printf("%02x", arr[size-1-i]);
            }

            printf("\n");
        }
        else
        {
            puts("canonicalized64 failed.");
        }

    #else
        puts("The implementation does not support canonicalized64 function or DEC64_SNAN macro.");
    #endif

    return 0;
}

输出:

The implementation does not support canonicalized64 function or DEC64_SNAN macro.


相关内容:
canonicalize double类型的存储规范结果的函数。
canonicalizel long double类型的存储规范结果的函数。
canonicalizef float类型的存储规范结果的函数。
canonicalized32 _Decimal32类型的存储规范结果的函数。
canonicalized128 _Decimal128类型的存储规范结果的函数。


主要参考资料:

1、ISO/IEC 9899:2024