#include <iostream>
#include <math.h>
using namespace std;
struct Vec4Ni10w2;
struct Vec4f32
{
float x, y, z, w;
Vec4f32(float x, float y, float z, float w) :
x(x), y(y), z(z), w(w)
{
}
Vec4f32(const Vec4Ni10w2 &v);
};
struct Vec4Ni10w2
{
int x : 10;
int y : 10;
int z : 10;
int w : 2;
Vec4Ni10w2(const Vec4f32 &v) :
x(round(511 * v.x)), y(round(511 * v.y)), z(round(511 * v.z)), w(round(v.w))
{
}
};
Vec4f32::Vec4f32(const Vec4Ni10w2 &v) :
x((float)v.x / 511), y((float)v.y / 511), z((float)v.z / 511), w((float)v.w)
{
}
ostream& operator <<(ostream& out, const Vec4f32 &v)
{
return out << "(" << v.x << ", " << v.y << ", " << v.z << ", " << v.w << ")";
}
ostream& operator <<(ostream& out, const Vec4Ni10w2 &v)
{
return out << "(" << v.x << ", " << v.y << ", " << v.z << ", " << v.w << ")";
}
int main() {
static_assert(sizeof(Vec4Ni10w2) == 4, "неверный размер Vec4Ni10w2");
Vec4f32 orig(0.2, -0.4, 0.6, -0.8);
cout << "Исходный float32-вектор: " << orig << endl;
Vec4Ni10w2 denorm(orig);
cout << "Денормализованный в INT_10_10_10_2: " << denorm << endl;
Vec4f32 back(denorm);
cout << "Преобразованный назад во float32: " << back << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFZlYzROaTEwdzI7CgpzdHJ1Y3QgVmVjNGYzMgp7CglmbG9hdCB4LCB5LCB6LCB3OwoKCVZlYzRmMzIoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgeiwgZmxvYXQgdykgOgoJCXgoeCksIHkoeSksIHooeiksIHcodykKCXsKCX0KCglWZWM0ZjMyKGNvbnN0IFZlYzROaTEwdzIgJnYpOwp9OwoKc3RydWN0IFZlYzROaTEwdzIKewoJaW50IHggOiAxMDsKCWludCB5IDogMTA7CglpbnQgeiA6IDEwOwoJaW50IHcgOiAyOwoKCVZlYzROaTEwdzIoY29uc3QgVmVjNGYzMiAmdikgOgoJCXgocm91bmQoNTExICogdi54KSksIHkocm91bmQoNTExICogdi55KSksIHoocm91bmQoNTExICogdi56KSksIHcocm91bmQodi53KSkKCXsKCX0KfTsKClZlYzRmMzI6OlZlYzRmMzIoY29uc3QgVmVjNE5pMTB3MiAmdikgOgoJeCgoZmxvYXQpdi54IC8gNTExKSwgeSgoZmxvYXQpdi55IC8gNTExKSwgeigoZmxvYXQpdi56IC8gNTExKSwgdygoZmxvYXQpdi53KQp7Cn0KCm9zdHJlYW0mIG9wZXJhdG9yIDw8KG9zdHJlYW0mIG91dCwgY29uc3QgVmVjNGYzMiAmdikKewoJcmV0dXJuIG91dCA8PCAiKCIgPDwgdi54IDw8ICIsICIgPDwgdi55IDw8ICIsICIgPDwgdi56IDw8ICIsICIgPDwgdi53IDw8ICIpIjsKfQoKb3N0cmVhbSYgb3BlcmF0b3IgPDwob3N0cmVhbSYgb3V0LCBjb25zdCBWZWM0TmkxMHcyICZ2KQp7CglyZXR1cm4gb3V0IDw8ICIoIiA8PCB2LnggPDwgIiwgIiA8PCB2LnkgPDwgIiwgIiA8PCB2LnogPDwgIiwgIiA8PCB2LncgPDwgIikiOwp9CgppbnQgbWFpbigpIHsKCXN0YXRpY19hc3NlcnQoc2l6ZW9mKFZlYzROaTEwdzIpID09IDQsICLQvdC10LLQtdGA0L3Ri9C5INGA0LDQt9C80LXRgCBWZWM0TmkxMHcyIik7CgkKCVZlYzRmMzIgb3JpZygwLjIsIC0wLjQsIDAuNiwgLTAuOCk7Cgljb3V0IDw8ICLQmNGB0YXQvtC00L3Ri9C5IGZsb2F0MzIt0LLQtdC60YLQvtGAOiAiIDw8IG9yaWcgPDwgZW5kbDsKCglWZWM0TmkxMHcyIGRlbm9ybShvcmlnKTsKCWNvdXQgPDwgItCU0LXQvdC+0YDQvNCw0LvQuNC30L7QstCw0L3QvdGL0Lkg0LIgSU5UXzEwXzEwXzEwXzI6ICIgPDwgZGVub3JtIDw8IGVuZGw7CgoJVmVjNGYzMiBiYWNrKGRlbm9ybSk7Cgljb3V0IDw8ICLQn9GA0LXQvtCx0YDQsNC30L7QstCw0L3QvdGL0Lkg0L3QsNC30LDQtCDQstC+IGZsb2F0MzI6ICIgPDwgYmFjayA8PCBlbmRsOwoKCXJldHVybiAwOwp9