Плавает в визуальной студии
Рассмотрим систему с плавающей запятой одинарной точности, соответствующую стандарту IEEE 754. В визуальной студии переключатель FP был установлен в строгое положение.
struct FP {
unsigned char a : 8;
unsigned char b : 8;
unsigned char c : 8;
unsigned char d : 8;
}*fp;
fp->a = 63;
fp->b = 128;
fp->c = 0;
fp->d = 1;
std::cout << "raw float = " << *reinterpret_cast<float*>(fp) << "\n";
Математическое значение согласно стандарту составляет 1.00000011920928955078125.
То, что визуальная студия печатает, является необработанным float = 2.36018991e-38. Зачем?
Предположим, что знак бит это 0. И 0111 1111 в экспоненциальной части.
В оставшихся 23 битах предполагается, что 01 и 10 являются младшими значащими битами, что означает, что математическое значение равно число 1 = 1,00000011920928955078125 и число 2 = 1,0000002384185791015625 соответственно. Среднее значение равно number3 = 1.000000178813934326171875. Таким образом, все значения между номерами 1 и 3 должны быть получены путем кодирования с 01 по меньшей мере двумя значащими битами, а значения между номерами 3 и 2 должны быть получены путем кодирования с 10 младшими значащими битами. Но Visual Studio захватывает 1.0000001788139343 (на самом деле это число между цифрами 1 и 3) и большие значения в кодировке с 10 младшими битами. Так что я скучаю?
1 ответ
Если вы посмотрите на https://www.h-schmidt.net/FloatConverter/IEEE754.html то увидите, что двоичное представление 2.36018991E-38 имеет вид
00000001 00000000 10000000 00111111 и это двоичное значение равно вашей структуре