2013-02-14 97 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