Преобразование байта в двоичный файл, добавление вывода в строку, преобразование в удвоение, вывод на печать ... потеря битов на выходе - PullRequest
1 голос
/ 21 января 2012

Итак, у меня проблемы с каким-то кодом.

Я хочу, чтобы эта функция принимала байтовый массив (пока тестируется с одним байтом), преобразовывала байт в двоичный и затем добавляла его к «1» использовать в расчете.

например:

выход: 01110000 ----> 1,01110000

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

double calcByteValue(uint8_t data[], int size);

int main() {
   uint8_t test[10];
   test[0] = 0x0e;

   double d = calcByteValue(test, 8);
   return 0;
}

double calcByteValue(uint8_t data[], int size) {
    int i;
    uint8_t bits[21];
    char binary[100];
    char str[100] = "1.";

    for (i = 0;i < size;i++) {                    
            bits[i] = (data[0] >> i) & 1;
            if (bits[i] == 0) {
                binary[i] = '0';
                printf("0(%d)\n", i);
            } else {
                binary[i] = '1';
                printf("1(%d)\n", i);
            }
    }

    strcat(str, binary);
    float d = atof(str);
    printf("%f\n", d);
    return 0;
    //return pow(-1, bits[0]) * pow(2, (128-127)) * atof(str));
}

Вот мой вывод, по какой-то причине он проходит весь цикл просто отлично, но печатает только 6 оригинальных битов, сбивая последние пару битов. Что я делаю не так ???

0(0)
1(1)
1(2)
1(3)
0(4)
0(5)
0(6)
0(7)
1.011100

Ответы [ 2 ]

0 голосов
/ 21 января 2012

Когда вы конвертируете строку в такой тип с плавающей точкой, вы всегда теряете некоторую точность. Вы вряд ли когда-либо сможете точно выразить десятичное число как число с плавающей точкой. 1.0111000 - это десятичное, а не двоичное число.

0 голосов
/ 21 января 2012

Первый:

strcat(str, binary);

Вы никогда не заканчивали нулем массив binary.Вы должны использовать его как строку.

 char binary[100];

binary определено в области видимости блока, а автоматические объекты области действия блока, которые не были явно инициализированы, имеют неопределенное значение.

Вот как завершить массив нулем:

binary[size] = '\0';

Секунда:

вы вставляете значения битов в обратном порядке.Положите (data[0] >> 7) & 1 для binary[0], (data[0] >> 6) & 1 для binary[1] и т. Д.

Также printf с %f в спецификации преобразования выводит 6 цифр после десятичной точки.Если вам нужно больше цифр (например, 16), вы можете указать точность следующим образом: printf("%.16f\n", d);

Вы также используете тип float для объекта d, если вы обнаружите, что это не такДостаточно точно с float, вы можете использовать тип double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...