什么是`long double`的格式说明符

时间:2013-02-14 09:22:43

标签: c++ c

我正在开发适用于各种Unix和Windows 32位和64位操作系统的应用程序。

我正在使用long double数据类型,当我执行sprintf()并使用long double并使用%lf时,它可以正常使用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()中再次输入强制转换?

4 个答案:

答案 0 :(得分:20)

对于long double,您应该使用格式"%Lf"。使用小L(即"%lf")格式化对POSIX系统没有影响(参见the specification)。

答案 1 :(得分:3)

The documentation非常清楚:

  

<强>→

     

以下 a,A,e,E,f,F,g G 转换对应于long double参数。 (C99>允许%LF,但SUSv2不允许。)

因此,您应该使用%Lf

答案 2 :(得分:0)

根据编译器,我看到%Lf%llf尝试两者,看看哪些有效。您使用的%lfdouble的格式说明符,而不是long double的格式说明符。我相信g++你应该使用%llf,而在visual studio上它是%Lf

答案 3 :(得分:0)

我会将此添加为评论,但我还不能这样做。同样重要的是要注意,您也可以使用指数&#39; p&#39;以这种方式表示long double

  • 定点表示法:%Lf
  • 指数表示法:%Le
  • p表示法:%La