Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “长双精度”的格式说明符是什么`_C++_C - Fatal编程技术网

C++ “长双精度”的格式说明符是什么`

C++ “长双精度”的格式说明符是什么`,c++,c,C++,C,我正在开发一个应用程序,它可以在各种风格的Unix和Windows 32位和64位操作系统上运行 我使用的是long double数据类型,当我使用sprintf()并将long double与%lf一起使用时,它在windows中运行良好,不会出现任何错误,但在Solaris平台上,它提供了核心转储 同一问题的示例代码如下所示 void main(){ string size = "16622"; string sizeFact = "20"; long long si

我正在开发一个应用程序,它可以在各种风格的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");
长双精度的格式说明符是什么

我在这里犯的错误是什么?我是否使用了错误的格式说明符,因为它给出了核心


为什么我需要在sprintf()中再次键入cast?

这取决于我所看到的编译器
%Lf
%llf
请尝试这两种方法,看看哪种方法有效。您使用的
%lf
double
的格式说明符,而不是
long double
。我认为在
g++
上应该使用
%llf
,而在visual studio上则是
%Lf

对于
长双精度
你应该使用格式
%Lf
。使用小L(即
“%lf”
)格式化对POSIX系统没有影响(请参阅)。

非常清楚地说明了这一点:

L

后面的A、A、e、e、f、f、gg转换对应于长双参数。(C99>允许%LF,但SUSv2不允许。)


因此,您应该使用
%Lf

我会将此添加为注释,但我还不能这样做。还需要注意的是,您也可以通过以下方式使用指数“p”符号表示
长双精度

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

我认为这取决于编译器。
%Lf
是否适用于所有版本的
g++
gcc
?我尝试使用Lf,它是否适用于所有版本的g++、gcc和visual studio,适用于所有风格的Unix平台(32位和64位)和windows平台(32位和64位)?@Prasadesdeshande它是在POSIX中指定的,所以应该在所有Unix或类似Unix的环境中都能工作。
%lf
%f
对扫描来说确实是有区别的,它只适用于打印它们等效的地方。@prasadesdeshande
l
l
都应该在VisualC++中工作(请参阅).
%Lf
是标准C中应该使用的。
%llf
无效,但在处理不合格的实现时,它是有用的信息。我从计算机科学竞赛中了解到这一点,我经常遇到这些问题。如果使用
llf
不起作用,我使用
Lf
。然而,在大多数情况下,llf仍然有效。如果我每次都得到一枚五分镍币,我就会因此失去几枚。。。