printf的0x8llx格式在X86平台下,无法对double进行有效的格式化。
但是在ARM平台就可以。
同事告诉我的原因,可能是ARM平台拥有更多的冗余寄存器,可以完成这部分展开。
但是X86的寄存器却很少。
而且这个X86的非对齐访问有关系吗?
这段代码运行错误
static void do_it(const char *fname, double r[], double p[], double (*tri)(double))
{
FILE* fd = fopen(fname, "w");
int i;
double d;
for (i = 0; i < POOL_MAX; i++) {
d = tri(p[i]);
r[i] = d;
printf("%.16e\n",r[i]);
printf("%.16e\n",d);
printf("%d---%llx\n", i, r[i]);
printf("%d---%llx\n", i, d);
fprintf(fd, "%08llx\n", r[i]);
}
fclose(fd);
}
这段代码运行正常
(而且如果你尝试用d=(unsigned long long int)l)这样方式,也会得到错的结果,一定要用memcpy。
X86的类型强制转换似乎非常保守,要么就是GCC的问题。
static void do_it(const char *fname, double r[], double p[], double (*tri)(double))
{
FILE* fd = fopen(fname, "w");
int i;
double d;
unsigned long long int l;
for (i = 0; i < POOL_MAX; i++) {
d = tri(p[i]);
r[i] = d;
memcpy(&l, &r[i], sizeof(l));
printf("%.16e\n",r[i]);
printf("%.16e\n",d);
printf("%08llx\n", l);
fprintf(fd, "%08llx\n", l);
}
fclose(fd);
}

895

被折叠的 条评论
为什么被折叠?



