我想保存f一个以i不擦除浮点数的方式命名的数组的第三个元素中命名的float变量的值(即,我不想保存1而不是1.5)。之后,以我们1.5在输出中看到的方式完成最后一行(不要使用cout<<1.5;或cout<<f;类似的技巧!)
float f=1.5;
int i[3];
i[2] = ... ;
cout<<... ;
Run Code Online (Sandbox Code Playgroud)
有人知道吗?
union如果在编译环境下它们具有相同的大小,请使用type-punning :
static_assert(sizeof(int) == sizeof(float));
int castFloatToInt(float f) {
union { float f; int i; } u;
u.f = f;
return u.i;
}
float castIntToFloat(int i) {
union { float f; int i; } u;
u.i = i;
return u.f;
}
// ...
float f=1.5;
int i[3];
i[2] = castFloatToInt(f);
cout << castIntToFloat(i);
Run Code Online (Sandbox Code Playgroud)
使用union是防止混叠问题的方法,否则编译器可能会由于优化而产生不正确的结果。
这是直接操作浮点数的常用技术。虽然通常uint32_t会代替使用。