Плавает в визуальной студии - PullRequest
0 голосов
/ 24 сентября 2018

Рассмотрим систему с плавающей запятой одинарной точности, соответствующую стандарту IEEE 754.В Visual Studio переключатель 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";

Математическое значение Tha в соответствии со стандартом равно 1.00000011920928955078125.

То, что печатает Visual Studio, является необработанным float = 2.36018991e-38.Почему?

Предположим, что знаковый бит равен 0. И 0111 1111 в части экспоненты.

В оставшихся 23 битах предполагается, что 01 и 10 являются младшими значащими битами, что означает, что математическое значение равно число1 =1,00000011920928955078125 и число 2 = 1,0000002384185791015625 соответственно.Среднее значение - число 3 = 1,000000178813934326171875.Таким образом, все значения между номерами 1 и 3 должны быть получены путем кодирования с 01 по меньшей мере двумя значащими битами, а значения между номерами 3 и 2 должны быть получены путем кодирования с 10 младшими значащими битами.Но Visual Studio захватывает 1.0000001788139343 (на самом деле это число между цифрами 1 и 3) и большие значения в кодировке с 10 младшими битами.Так что я скучаю?

1 Ответ

0 голосов
/ 24 сентября 2018

Если вы посмотрите на https://www.h -schmidt.net / FloatConverter / IEEE754.html , то вы увидите, что двоичное представление 2.36018991E-38 равно

00000001 00000000 1000000000111111, и это двоичное значение равно вашей структуре

enter image description here

...