Информация об изменениях

Сообщение Re[5]: 3/4 vs 0.75 от 01.07.2021 9:50

Изменено 01.07.2021 9:56 Dair

Re[5]: 3/4 vs 0.75
Здравствуйте, ути-пути, Вы писали:

D>>float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель.

УП>Вроде могут быть нюансы со специальными значениями типа nan, inf и т.п.?

нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем:

auto myValues = (uint64_t)floatTag;
uint32_t numerator = myValues >> 32;
uint32_t denominator = myValues & 0xFFFFFFFF;


или даже

auto myValues = (uint64_t)floatTag;
uint32_t numerator = 0;
uint32_t denominator = 0;

memcpy(&floatTag, &denominator, 4);
memcpy(((char*)&floatTag) + 4, &numerator, 4);
Re[5]: 3/4 vs 0.75
Здравствуйте, ути-пути, Вы писали:

D>>float это нонче 64 бита же? Ну и кодируй ими два 32-битных числа, числитель и знаменатель.

УП>Вроде могут быть нюансы со специальными значениями типа nan, inf и т.п.?

нам то что оно float вообще не очень интересно, поэтому и nan/inf тоже. Для нас это 64 бита, которые мы как хотим так и рассматриваем:

auto myValues = (uint64_t)floatTag;
uint32_t numerator = myValues >> 32;
uint32_t denominator = myValues & 0xFFFFFFFF;


или даже

auto myValues = (uint64_t)floatTag;
uint32_t numerator = 0;
uint32_t denominator = 0;

memcpy(&floatTag, &denominator, 4);
memcpy(((char*)&floatTag) + 4, &numerator, 4);


А, да, если этот float десериализуется из строчки, или ещё где-то участвует в операциях с плавающей точкой, тогда бОльшая беда, конечно. Тогда тупо математикой — про порядок забиыть, пользоваться мантиссой в десятичном представлении, как тс изначально писал — числитель*выбранное смещение + знаменатель.