2013-02-14 100 views
19

我正在研究适用于各种Unix和Windows 32位和64位操作系统的应用程序。什么是`long double'的格式说明符

我使用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()中再输入一次?

回答

16

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

+0

我相信这取决于编译器。 '%Lf'是否适用于所有版本的'g ++'和'gcc'? – 2013-02-14 09:29:09

+0

我试过使用LF工作,它是否适用于Unix平台(32和64位)和Windows平台(32和64位)的所有版本的g ++,gcc和visual studio的所有版本? – 2013-02-14 09:31:18

+0

@PrasadSDeshpande它是在POSIX中指定的,所以应该在所有Unix或类Unix环境中工作。 – 2013-02-14 09:32:36

0

根据我所看到的编译器%Lf%llf试一下,看看哪些工作。您使用的%lfdouble的格式说明符,而不是long double。我相信g++你应该使用%llf,而在视觉工作室它是%Lf

+0

'%Lf'是你在标准C中应该使用的。'%llf'是无效的,但如果处理不合格的实现,它是有用的信息。 – hvd 2013-02-14 09:29:35

+0

我从计算机科学竞赛中知道这一点,我总是遇到问题。如果使用'llf'不起作用,我使用'Lf'。大多数情况下'llf'都是可行的。如果每次因为那个而丢失了几个,我就得到了一个镍... – 2013-02-14 09:31:43

3

The documentation使这很清楚:

大号

甲以下一个,A,E,E,F,F,G,或ģ转换对应于长双重论点。 (C99>允许%LF,但SUSv2不)。

因此,您应该使用%Lf

0

我会将此添加为评论,但我还不能做到这一点。同样重要的是要注意,你也可以以这种方式使用指数“P”符号为long double

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