арифметические операции с использованием плавающего двоичного числа "0b" - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь понять, я новичок.

Я хочу делать арифметические операции с числами с плавающей запятой в двоичном формате.

Я использовал http://www.binaryconvert.com/result_float.html длясделать преобразование

Только он мне вернет:

1069547520.000000
1069547520.000000
2139095040.000000

Что это?

Я надеялся на это:

00111111110000000000000000000000
00111111110000000000000000000000
01000000010000000000000000000000

% fв printf () тоже будет неправильно?

    #include <stdio.h>

    int main()
    {
        float a = 0b00111111110000000000000000000000; /* 1.5 */
        float b = 0b00111111110000000000000000000000; /* 1.5 */
        float c;

        c = a + b; /* 3.0 !? */

        printf("%f\n", a);
        printf("%f\n", b);
        printf("%f\n", c);

        return 0;
    }

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Ваши двоичные литералы являются целыми числами литералами.Затем вы печатаете значения с плавающей запятой как значения с плавающей запятой, не используя двоичное представление.

0 голосов
/ 21 октября 2018

Двоичная константа 0b00111111110000000000000000000000 является расширением GCC и имеет тип int, имеющий значение 1069547520.Он преобразуется в число с плавающей точкой с тем же значением, то есть с плавающей точкой, ближайшей к 1069547520.

Невозможно иметь константы с плавающей запятой в двоичном виде в C;но гекс возможен.Если бы это было, то 1.5 было бы выражено в двоичном виде просто как что-то вроде

0b1.1f 

, то есть его числовое значение в двоичном виде было 1.1.

C17 (C99, C11) действительно имеет поддержкудля шестнадцатеричные константы с плавающей точкой ;Вы можете использовать

0x1.8p0f

для 1.5f;p0 означает показатель степени.

Если вы действительно хотите поиграть с двоичным форматом IEEE 754, вам нужно использовать объединение или memcpy.Например

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

int main(void) {
    float a;
    uint32_t a_v = 0b00111111110000000000000000000000;

    memcpy(&a, &a_v, sizeof(float));
    printf("%f\n", a);
    // prints 1.500000 on linux x86-64
}
...