为了账号安全,请及时绑定邮箱和手机立即绑定

printf和long double

printf和long double

C
红颜莎娜 2019-12-03 11:12:48
我在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+0040.000053 can be written 5.320000e-005-1950228512509697500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000can be written 2.725000e+002Press [Enter] to close the terminal ...
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-12-03
?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

从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)与运行时混合在一起似乎并没有什么问题。


查看完整回答
反对 回复 2019-12-03
?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

如果使用的是MinGW,则问题在于默认情况下,MinGW使用I / O响应。Microsoft C运行时提供的格式化功能,该功能不支持80位浮点数(在Microsoft land中为long double== double)。

但是,MinGW还附带了一组替代实现,它们确实支持长双打。要使用它们,请在函数名称前加上__mingw_(例如__mingw_printf)。根据项目的性质,您可能还想全局#define printf __mingw_printf或使用-D__USE_MINGW_ANSI_STDIO(这将启用所有printf-family函数的MinGW版本)。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 1073 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信