32-битное значение с плавающей запятой (как в данном случае) представляется как 1 бит знака, 8 битов экспоненты и 23 бита дробной части мантиссы.
Во-первых, забудьте о знаке того, что вы вставили. Затем все остальное, что вы положили, будет сохранено как часть формата
(1 + x / 8,388,608) * 2 ^ (у-127) (обратите внимание, что 8,388,608 равно 2 ^ 23). Где х - дробная мантисса, а у - показатель степени. Хотите верьте, хотите нет, в этой форме есть только одно представление для каждого введенного вами значения. Сохраненное значение будет самым близким значением к желаемому числу, если ваше значение не может быть представлено точно, это означает, что вы получите дополнительно .0001 или что-то еще.
Итак, если вы хотите выяснить значение, которое будет фактически сохранено, просто выясните, во что оно превратится.
Итак, второе, что нужно сделать (после выброса знака), - найти наибольшую степень 2, которая меньше по величине, чем число, которое вы представляете. Итак, давайте возьмем 43,2.
Наибольшая степень двух меньших, чем это, составляет 32. Так что это «1» слева, так как это 32, а не 1, это означает, что значение 2 ^ справа должно быть 2 ^ 5 (32) , что означает, что у 132. Так что теперь вычтите из 32, это сделано для. Осталось 11.2. Теперь нам нужно представить 11,2 как дробь более 8,338,608 раз 2 ^ 5.
So
11,2 приблизительно равно x * 32 / 8,336,608 или x / 262,144. Значение, которое вы получите для x, равно 2,938,013 / 262,144. Реальный числитель был на 0,2 ниже (2 938 012,8), поэтому будет ошибка 0,2 в 262 144 или 2 в 131 072. В десятичном формате это значение равно 0,000015258789063. Поэтому, если вы напечатаете достаточно цифр, вы увидите это значение ошибки в вашем выводе.
Когда вы видите, что выходной сигнал слишком низкий, это происходит потому, что округление пошло в другую сторону, полученное значение было ближе к требуемому значению, будучи слишком низким, и поэтому вы получаете выходной сигнал, который является слишком низким. Когда значение может быть представлено точно (как, например, любая степень 2), вы никогда не получите ошибку.
Это не просто, но вот, пожалуйста. Я уверен, что вы можете закодировать это.
* примечание: для очень малых по величине значений (примерно менее 2 ^ -127) вы попадаете в странность, называемую денормалией. Я не собираюсь их объяснять, но они не будут соответствовать шаблону. К счастью, они не появляются много. И как только вы попадаете в этот диапазон, ваша точность все равно возрастает.