-1

У меня есть сложная проблема, которую я не понимаю. У меня есть массив uint8_t, который мне нужно преобразовать в 32-битную с плавающей запятой. Я использую memcpy для выполнения этого ... однако округление кажется выключенным. Может кто-то, пожалуйста, объясните, что происходит/решение этой проблемы, заранее. Массив коэффициентаByteSwap содержит два коэффициента: один в первых четырех байтах и ​​другой во 2-м 4 байтах.точность с плавающей точкой с использованием memcpy C++

static float32_t coefficient[ALLSENSORS][NUM_QUADRATIC_FIELDS]; 
uint8_t coefficientByteSwap[8]; 


memcpy(&coefficient[sensor][2], &coefficientByteSwap[0], sizeof(float32_t)); 
memcpy(&coefficient[sensor][3], &coefficientByteSwap[4], sizeof(float32_t)); 

пример:

coefficientByteSwap[0] = 0xE8 
coefficientByteSwap[1] = 0x32 
coefficientByteSwap[2] = 0xB5 
coefficientByteSwap[3] = 0xBC 

должно быть значение с плавающей точкой: -.022119 , но когда я печатаю его это выходит: -.022119000554

+0

Косвенное литье из 'float' предположений представления, вероятно, плохая идея! –

+0

вы не можете представить это число как плавающую точку. Если вы хотите больше точности, вместо этого вы можете использовать 'double', но нет никакой возможности получить бесконечную точность с переменной конечного размера. –

+2

'BCB532E8' на самом деле' -0.022119000554', а не '-0.22119' –

ответ

3

Ваше предположение неверно. Посмотрите на это:

float f = -.022119; 
std::cout << std::setprecision(20) << f << std::endl; 

Печать: -0,022119000554084778

+0

Почему это ????? – user2494298

+5

@ user2494298: Это похоже на ошибку, которую вы представляете 2/3 в десятичной системе. Он повторяется бесконечно, поэтому вам нужно где-то его отключить. –

Смежные вопросы