将浮点数保存为整数而不损失浮点精度

Abr*_*ham 1 c++

我想保存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)

有人知道吗?

Mil*_*Yip 5

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会代替使用。