c - Windows/Linux 上整数数字的巨大 printf float/double 差异

标签 c windows gcc floating-point printf

#include <float.h> 
#include <stdio.h> 

int main(int argc, char** argv) 
{ 
  printf("[0] %f\n", FLT_MAX); 
  printf("[1] %lf\n", FLT_MAX); 
  printf("[2] %Lf\n", FLT_MAX); // gcc warning: expects argument of type     ‘long double’ 
  printf("[3] %f\n", DBL_MAX); 
  printf("[4] %lf\n", DBL_MAX); 
  printf("[5] %Lf\n", DBL_MAX); // gcc warning: expects argument of type     ‘long double’ 

  //using C++ und std::numeric_limits<float/double>::max() gives same     results

  return 0; 
} 
Linux: x64 lsb_release -d 打印“描述:Ubuntu 15.04” gcc --version 打印“gcc (Ubuntu 4.9.2-10ubuntu13) 4.9.2” ldd --version 打印“ldd (Ubuntu GLIBC 2.21-0ubuntu4) 2.21”

[0] 340282346638528859811704183484516925440.000000 
[1] 340282346638528859811704183484516925440.000000 
[2] --> warning-line disabled 
[3] 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 
[4] 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 
[5] --> warning-line disabled

Windows 7 x64: VS2010(最新版本10.0.40219.1 SP1Rel)调试/Win32

[0] 340282346638528860000000000000000000000.000000 
[1] 340282346638528860000000000000000000000.000000 
[2] 340282346638528860000000000000000000000.000000
[3] 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
[4] 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 
[5] 179769313486231570000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000    

FLT_MAX 上的差异 VS2010:340282346638528860000000000000000000000.000000 GCC4.9.2:340282346638528859811704183484516925440.000000

是 1.8829581651548307456e+20(没那么小) - 并且使用 double 变得更大

更新:实际问题

有没有一种方法(只需对代码进行少量更改)即可在 Linux 和 Windows(以及其他)上获得相同的结果,或者我是否需要在所有系统上使用完全相同的实现?我担心自己的 Windows/Linux/Linux-ARM/VxWorks/Solaris 平台实现。

最佳答案

printf 函数在这些平台上的实现方式不同。

看看这段代码:

#include <stdio.h>

int main()
{
    printf("%lf\n", ((double)1e100)/3);
    return 0;
}

这个用 VC++ 编译的程序给出:

3333333333333333200000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000

而使用 g++ 编译的同一程序给出:

3333333333333333224453896013722304246165110619355184909726539264904319486405759542029132894851563520.000000

关于c - Windows/Linux 上整数数字的巨大 printf float/double 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30935634/

相关文章:

c - shmat 返回 errno=13(EACCES) 的段错误

c - 结构成员获取了错误的数据

c - Mosquitto 发布者未发布任何消息

c++ - 如何防止非 Unicode 应用程序在将资源加载到不同本地化的机器上时转换资源的字符集?

C++/Windows - : system ("dir\\b *.dat > tmp.txt") 的含义

Windows 批处理脚本 url 解码

c - 为什么编译时没有捕获 "symbol lookup error"?

c - 如何在C中的char数组中存储2位整数值和浮点值

c - 如何定义 80 位大小的变量

c - 如何强制 gcc 使用 int 进行系统调用,而不是 sysenter?