【问题标题】:What is format specifier for `long double`什么是`long double`的格式说明符
【发布时间】:2013-02-14 09:22:43
【问题描述】:

我正在开发适用于各种 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() 中再输入一次强制类型转换?

【问题讨论】:

    标签: c++ c


    【解决方案1】:

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

    【讨论】:

    • 我相信这取决于编译器。 %Lf 是否适用于所有版本的 g++gcc
    • 我尝试使用 LF 它有效,它是否适用于所有版本的 g++、gcc 和 Visual Studio 在所有版本的 Unix 平台(32 和 64 位)和 Windows 平台(32 和 64 位)上?
    • @PrasadSDeshpande 它在 POSIX 中指定,因此应该适用于所有 Unix 或类 Unix 环境。
    • 可能值得指出的是,%lf%f 确实对扫描有所不同,它仅适用于在它们等效的地方打印。
    • @PrasadSDeshpande lL 都应该在 VisualC++ 中工作(参见 here)。
    【解决方案2】:

    The documentation 说得很清楚:

    L

    a、A、e、E、f、F、gG 转换之后的

    对应于 long double 参数。 (C99 > 允许 %LF,但 SUSv2 不允许。)

    所以,你应该使用%Lf

    【讨论】:

      【解决方案3】:

      我会将此添加为评论,但我还不能这样做。同样重要的是要注意,您还可以通过这种方式对long double 使用指数“p”表示法:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • %Lf 是您应该在标准 C 中使用的内容。%llf 无效,但在处理不符合要求的实现时它是有用的信息。
        • 我从计算机科学竞赛中知道这一点,在这些竞赛中我总是遇到问题。如果使用llf 不起作用,我使用Lf。大多数时候llf 仍然是有效的。如果我每次因此而失去几个时都得到一个镍...
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 2013-06-22
        • 2010-11-03
        相关资源
        最近更新 更多