我有一些代码在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)
为什么?我根本没有任何线索.谢谢.
试试这个:
#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算法实现?