猿问

printf和long double

我在Windows上将最新的gcc与Netbeans一起使用。为什么不起作用long double?是printf符%lf错了吗?


码:


#include <stdio.h>


int main(void)

{

    float aboat = 32000.0;

    double abet = 5.32e-5;

    long double dip = 5.32e-5;


    printf("%f can be written %e\n", aboat, aboat);

    printf("%f can be written %e\n", abet, abet);

    printf("%lf can be written %le\n", dip, dip);


    return 0;

}

输出:


32000.000000 can be written 3.200000e+004

0.000053 can be written 5.320000e-005

-1950228512509697500000000000000000000000000000000000000000000000000000000000000

000000000000000000000000000000000000000000000000000000000000000000000000.000000

can be written 2.725000e+002

Press [Enter] to close the terminal ...


红颜莎娜
浏览 1075回答 3
3回答

偶然的你

除了错误的修饰符之外,gcc的哪个端口可以连接到Windows?mingw使用Microsoft C库,并且我似乎还记得该库不支持80位长的double(出于各种原因,Microsoft C编译器使用64位长的double)。

白猪掌柜的

从printf联机帮助页:l(ell)后续的整数转换对应于long int或unsigned long int参数,或者后续的n转换对应于long int参数的指针,或者后续的c转换对应于wint_t参数,或后续的s转换对应于wchar_t参数的指针。和遵循a,A,e,E,f,F,g或G转换的LA对应于长double自变量。(C99允许%LF,但SUSv2不允许。)所以,你想要%Le,不是%le编辑:一些进一步的调查似乎表明Mingw使用MSVC / win32运行时(用于诸如printf之类的东西)-将long double映射为double。因此,将提供本机long double的编译器(如gcc)与运行时混合在一起似乎并没有什么问题。

潇潇雨雨

如果使用的是MinGW,则问题在于默认情况下,MinGW使用I / O响应。Microsoft C运行时提供的格式化功能,该功能不支持80位浮点数(在Microsoft land中为long double==&nbsp;double)。但是,MinGW还附带了一组替代实现,它们确实支持长双打。要使用它们,请在函数名称前加上__mingw_(例如__mingw_printf)。根据项目的性质,您可能还想全局#define printf __mingw_printf或使用-D__USE_MINGW_ANSI_STDIO(这将启用所有printf-family函数的MinGW版本)。
随时随地看视频慕课网APP
我要回答