LINUX.ORG.RU

Перевод float в hex


0

1

Всем привет, возник такой вопрос как перевести число c плавающей точкой в шестнадцатеричное число, ну т.е. на примере число 0.2 должно превратиться в 3FC99999A0000000h. Я решил попробовать таким образом сделать:

float d = 0.2;
int i = *((int*)(&d));
char buff[16];
sprintf(buff, "%.16X", i);
puts(buff);
но ответ у меня получился такой: 000000003E4CCCCDh помогите пожалуйста как это решить?

★★★

Последнее исправление: Int64 (всего исправлений: 5)

float d = 0.2;

int i = *((int*)(&d));

филиал govnokod.ru официально открыт

x0r ★★★★★
()
#include <stdio.h>
#include <stdint.h>
union
{
    uint64_t v;
    float f;
} u;


int main(int argc, char* argv[]){
    u.f = 0.2f;

    printf("%lX\n", u.v);
}
hizel ★★★★★
()

Если есть желание именно 3FC, то можно расширить программочку предыдущего автора:

#include <stdio.h>
#include <stdint.h>
union
{
    uint64_t v;
    float f;
    double d;
} u;


int main(int argc, char* argv[]){
    u.f = 0.2f;
    printf("%lX\n", u.v);
    u.d = 0.2f;
    printf("%llX\n", u.v);
}

Имеем:

$ ./float
3E4CCCCD
3FC99999A0000000

io ★★
()
Последнее исправление: io (всего исправлений: 1)

#!/bin/bash
gcc -x c - << MARK
#include <stdio.h>
#include <stdint.h>
int main() {
union {
float d;
uint64_t i;
} u;
u.d = 0.2f;
printf(«0x%lX\n», u.i);
return 0;
}
MARK
./a.out
exit

pacify ★★★★★
()

И такой вариант:

#include <stdio.h>
#include <stdint.h>
typedef union{
	unsigned char c[8];
	float f;
	double d;
} df_union;


void prt(df_union *v){
	int i;
	for(i = 0; i < 8; i++)
		printf("%.2x ", v->c[i]);
	printf("\n");
}

int main(int argc, char* argv[]){
	df_union u;
	u.f = 0.2f;
	printf("var %g == 0x", u.f);
	prt(&u);
	u.d = 0.2f;
	printf("var %g == 0x", u.d);
	prt(&u);
}

gcc 2.c  && ./a.out 
var 0.2 == 0xcd cc 4c 3e ff 7f 00 00 
var 0.2 == 0x00 00 00 a0 99 99 c9 3f 
Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от anonymous

да знаю что лол, просто я вообще не знаком с union ами, раньше на дельфях сидел и недавно только пересел на Си.

Int64 ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.