Как кодируется код 1 в C / C ++ как число с плавающей точкой (при условии представления IEEE 754 с одинарной точностью)? - PullRequest
1 голос
/ 22 июня 2019

У меня сложилось впечатление, что C float имеет 8 бит экспоненты и 23 бит мантиссы.

То есть 0011 1111 1000 0000 0000 0000 0000 0000 = 0x3F800000.

Однако следующий код выдает 1.06535e + 09 вместо 1. Может кто-нибудь помочь мне понять, почему?

#include <iostream>
#include <math.h>  

using namespace std;

int main()
{
    float i = 0x3F800000;
    cout<<i << endl;
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Как 1 кодируется в C как число с плавающей точкой?

Может кто-нибудь помочь мне понять, почему (код не работает)?

float i = 0x3F800000;

совпадает с i = 1065353216;


В C для наложения битовой комбинации используйте union или memcpy().

В C ++ предложите memcpy().

Использование приведения может привести к сбою из-за сглаживания. @ Эрик Постпишил

#include <stdio.h>
#include <stdint.h>

_Static_assert(sizeof(float) == sizeof(uint32_t), "Unexpected types");

int main(void) {
  union {
    uint32_t u; 
    float f;
  } x = {.u = 0x3f800000};
  float f = x.f;
  printf("%e\n", f);
  return 0;
}

В менее распространенных системах это может привести к сбою из-за

  • float не является двоичным32 .

  • Порядковый номер отличается от float/uint32

1 голос
/ 24 июня 2019

Используя IEEE-754, число с плавающей запятой 1 записывается как:

0 01111111 00000000000000000000000 (base-2) = 3f80 0000 (base-16)

Итак, ваше предположение верно.К сожалению, битовый массив, представленный 0x3f800000, не может быть назначен для числа с плавающей запятой, просто выполнив:

float a = 0x3f800000

Шестнадцатеричное число сначала будет преобразовано в целое число без знака, которое имеет значение 1065353216 в базе-10.Затем это число будет неявно преобразовано в ближайшее число с плавающей запятой.

Короче говоря, хотя ваш битовый шаблон для числа с плавающей запятой IEEE-754 правильный, ваше предположение о том, как назначить этот шаблон, неверно.,Посмотрите на Преобразование шестнадцатеричного числа в число с плавающей запятой и наоборот в C , как этого можно достичь, или другие ответы в этом вопросе.

...