我想知道如何解释我今天观察到的浮点差异.这是一个错误,还是触发了一些未定义的行为?以下是代码.我希望理解这种行为,这样我就可以使它在编译器、处理器和平台上保持一致.
#include <stdio.h>
#include <math.h>
#define BUG_ON_GCC
#ifdef BUG_ON_GCC
__attribute__((noinline))
#else
inline __attribute__((always_inline))
#endif
double safe_pow(
double x,
double y)
{
printf("x = %llx\n", *((unsigned long long *)&x));
printf("y = %llx\n", *((unsigned long long *)&y));
double result = pow(x, y);
printf("r = %llx\n", *((unsigned long long *)&result));
return result;
}
int main() {
printf("%ld\n", sizeof(pow(15.034465284692086, 3.466120406090667)));
printf("%.24f\n", pow(15.034465284692086, 3.466120406090667));
printf("%ld\n", sizeof(safe_pow(15.034465284692086, 3.466120406090667)));
printf("%.24f\n", safe_pow(15.034465284692086, 3.466120406090667));
return 0;
}
以及我在Linux VM中使用Clang所看到的结果:
8
12020.670425990641888347454369
8
x = 402e11a56f0d331e
y = 400bba9d55e142e0
r = 40c77a55d084d419
12020.670425990641888347454369
在同一个VM中使用GCC:
8
12020.670425990643707336857915
8
x = 402e11a56f0d331e
y = 400bba9d55e142e0
r = 40c77a55d084d419
12020.670425990641888347454369
在同一台计算机上使用MacOS上的Clang:
8
12020.670425990643707336857915
8
x = 402e11a56f0d331e
y = 400bba9d55e142e0
r = 40c77a55d084d41a
12020.670425990643707336857915