在Mac OSX和Linux下使用printf语句键入转换

f.e*_*.co 5 c c++

我有一些代码在Mac OSX和Linux(Ubuntu,Fedora,...)下表现不同.这是关于printf语句中的算术运算中的类型转换.代码使用gcc/g ++编译.

下列

#include <stdio.h>
int main () {
  float days = (float) (153*86400) / 86400.0;
  printf ("%f\n", days);
  float foo = days / 30.6;
  printf ("%d\n", (int) foo);
  printf ("%d\n", (int) (days / 30.6));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在Linux上生成

153.000000
5
4
Run Code Online (Sandbox Code Playgroud)

在Mac OSX上

153.000000
5
5
Run Code Online (Sandbox Code Playgroud)

为什么?

令我惊讶的是,这适用于Mac OSX和Linux

printf ("%d\n", (int) (((float)(153 * 86400) / 86400.0) / 30.6));
printf ("%d\n", (int) (153 / 30.6));
printf ("%.16f\n",    (153 / 30.6));
Run Code Online (Sandbox Code Playgroud)

为什么?我根本没有任何线索.谢谢.

Ric*_*ton 5

试试这个:

#include <stdio.h>
int main () {
  float days = (float) (153*86400) / 86400.0;
  printf ("%f\n", days);
  float foo = days / 30.6;
  printf ("%d\n", (int) foo);
  printf ("%d\n", (int) (days / 30.6));
  printf ("%d\n", (int) (float)(days / 30.6));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意会发生什么?双重浮动转换是罪魁祸首.请记住,float总是在varargs函数中转换为double.不过,我不确定为什么macos会有所不同.更好(或更糟)的IEEE算法实现?