float_t和double_t格式说明符

问题描述 投票:5回答:2

intN_t类型有新的格式说明符,例如%"PRIiN"%"SCNiN",用于printfscanf函数族。

如果有的话,float_tdouble_t的新格式说明符是什么? (在math.h中定义)

我可以 - 使用%f%lf吗?我不这么认为,因为float_t只是至少和float一样大,但可以定义为long double

没有人回答,我在任何地方找不到答案,可能是C中的错误?

c floating-point c99 format-specifiers math.h
2个回答
1
投票

要谨慎和便携,你可以在你的%Lf控制字符串中使用printf并将float_tdouble_t类型的值转换为long double

编辑:long double的格式说明符是%Lf而不是%lf

你必须对scanf更加谨慎,因为在这种情况下,施法对你没有帮助。

或者你可以为printfscanf定义你自己的float_tdouble_t格式说明符,利用FLT_EVAL_METHOD [1]宏来找出float_tdouble_t分别相当于哪些内置类型。


0
投票

标准中不存在这些,因此您必须自己使用FLT_EVAL_METHOD(C11 7.12.2)来定义它们。

我将分享我在我的库中编写的代码来执行此操作:

#if (FLT_EVAL_METHOD == 0)
#define PRIaFLT     "a"
#define PRIAFLT     "A"
#define PRIeFLT     "e"
#define PRIEFLT     "E"
#define PRIfFLT     "f"
#define PRIFFLT     "F"
#define PRIgFLT     "g"
#define PRIGFLT     "G"

#define SCNaFLT     "a"
#define SCNeFLT     "e"
#define SCNfFLT     "f"
#define SCNgFLT     "g"

#define PRIaDBL     "la"
#define PRIADBL     "lA"
#define PRIeDBL     "le"
#define PRIEDBL     "lE"
#define PRIfDBL     "lf"
#define PRIFDBL     "lF"
#define PRIgDBL     "lg"
#define PRIGDBL     "lG"

#define SCNaDBL     "la"
#define SCNeDBL     "le"
#define SCNfDBL     "lf"
#define SCNgDBL     "lg"


#elif   (FLT_EVAL_METHOD == 1)
#define PRIaFLT     "la"
#define PRIAFLT     "lA"
#define PRIeFLT     "le"
#define PRIEFLT     "lE"
#define PRIfFLT     "lf"
#define PRIFFLT     "lF"
#define PRIgFLT     "lg"
#define PRIGFLT     "lG"

#define SCNaFLT     "la"
#define SCNeFLT     "le"
#define SCNfFLT     "lf"
#define SCNgFLT     "lg"

#define PRIaDBL     "la"
#define PRIADBL     "lA"
#define PRIeDBL     "le"
#define PRIEDBL     "lE"
#define PRIfDBL     "lf"
#define PRIFDBL     "lF"
#define PRIgDBL     "lg"
#define PRIGDBL     "lG"

#define SCNaDBL     "la"
#define SCNeDBL     "le"
#define SCNfDBL     "lf"
#define SCNgDBL     "lg"


#elif   (FLT_EVAL_METHOD == 2)
#define PRIaFLT     "La"
#define PRIAFLT     "LA"
#define PRIeFLT     "Le"
#define PRIEFLT     "LE"
#define PRIfFLT     "Lf"
#define PRIFFLT     "LF"
#define PRIgFLT     "Lg"
#define PRIGFLT     "LG"

#define SCNaFLT     "La"
#define SCNeFLT     "Le"
#define SCNfFLT     "Lf"
#define SCNgFLT     "Lg"

#define PRIaDBL     "La"
#define PRIADBL     "LA"
#define PRIeDBL     "Le"
#define PRIEDBL     "LE"
#define PRIfDBL     "Lf"
#define PRIFDBL     "LF"
#define PRIgDBL     "Lg"
#define PRIGDBL     "LG"

#define SCNaDBL     "La"
#define SCNeDBL     "Le"
#define SCNfDBL     "Lf"
#define SCNgDBL     "Lg"
#endif

然后你应该能够做到:

double_t    x;

scanf(" %"SCNaDBL"", &x);
printf("x = %"PRIaDBL"\n", x);
© www.soinside.com 2019 - 2024. All rights reserved.