什么是`long double`的格式说明符
我正在研究适用于各种Unix和Windows 32位和64位操作系统的应用程序。
我正在使用long double
数据类型,当我执行sprintf()
并在其中使用带有%lf
long double
,它可以正常使用windows并不会产生任何类型的错误,但是在Solaris平台上它提供了核心转储。
相同问题的示例代码如下。
void main(){ string size = "16622"; string sizeFact = "20"; long long sizeLongLong = strtoll(size); int factInt = atoi(sizeFact); long double sizeLongDouble = (long double) sizeLongLong/pow(2, factInt); char buf[512]; sprintf(buf, "%.3lf %s", sizeLongDouble, "str"); }
如上所述,代码在Windows 32位和64位上运行良好,但对于sprintf,它在Solaris上为我提供了核心。
我尝试在sprintf中进行类型转换,它工作得很好。
sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str");
long double
的格式说明符是什么?
我在这里犯的错是什么,我使用了错误的格式说明符,因为它给了核心?
为什么我需要在sprintf()中再次输入强制转换?
对于long double
您应该使用格式"%Lf"
。 使用小L(即"%lf"
)格式化对POSIX系统没有影响(请参阅规范 )。
该文档非常清楚:
大号
随后的a,A,e,E,f,F,g或G转换对应于长双参数。 (C99>允许%LF,但SUSv2不允许。)
所以,你应该使用%Lf
。
根据编译器,我看到%Lf
和%llf
尝试两者并查看哪些有效。 您使用的%lf
是double
的格式说明符,而不是long double
。 我相信g++
你应该使用%llf
,而在visual studio上它是%Lf
。
我会将此添加为评论,但我还不能这样做。 同样重要的是要注意,你也可以用这种方式使用指数’p’符号表示long double
:
- 定点表示法:
%Lf
- 指数表示法:
%Le
- 表示法:
%La