C++ “长双精度”的格式说明符是什么`
我正在开发一个应用程序,它可以在各种风格的Unix和Windows 32位和64位操作系统上运行 我使用的是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
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、g或g转换对应于长双参数。(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
对扫描来说确实是有区别的,它只适用于打印它们等效的地方。@prasadesdeshandel
和l
都应该在VisualC++中工作(请参阅).%Lf
是标准C中应该使用的。%llf
无效,但在处理不合格的实现时,它是有用的信息。我从计算机科学竞赛中了解到这一点,我经常遇到这些问题。如果使用llf
不起作用,我使用Lf
。然而,在大多数情况下,llf仍然有效。如果我每次都得到一枚五分镍币,我就会因此失去几枚。。。