Преобразовать число с плавающей точкой в ​​целочисленный эквивалент - PullRequest
2 голосов
/ 07 июля 2010

Я хочу преобразовать пользовательский ввод с плавающей запятой в его целочисленный эквивалент.Я мог бы сделать это, приняв входную строку, скажем «-1.234», а затем я мог просто явно преобразовать каждый символ в его десятичное представление.(между прочим, big endian)Поэтому я бы просто сказал для примера, который я привел,

-1.234 = 1|01111111|00111011111001110110110

sign bit = 1 = 128<<31
exponent bits = 01111111 = 127<<23
mantissa bits = 00111011111001110110110 = 1962934
decimal equivalent = 1962934 + 127<<23 + 128<<31

Это достаточно просто, но громоздко.Есть лучший способ сделать это?Может быть, какое-нибудь приведение типов я могу сделать?

Ответы [ 4 ]

7 голосов
/ 07 июля 2010

Объединение позволяет вам получить доступ к одному и тому же куску памяти, что и различные типы.

union floatint
{
   float f;
   int i;
}

floatint fi;
fi.f=-1.234;
int i=fi.i;

Предупреждение: вы можете столкнуться со странными различиями в платформе и тому подобным из-за размера и размера, но так как вы ужеДелая некоторые предположения, пытаясь интерпретировать число с плавающей точкой как int, вы можете сойти с рук.Узнайте больше о профсоюзах, я думаю, это то, что вы хотите.

3 голосов
/ 07 июля 2010
float a = -1.234;
int b = *(int*)&a;

Кроме того, в C ++ есть оператор преобразования, который не выполняет никаких проверок, reinterpret_cast.Здесь, наверное, лучше.

int b = *reinterpret_cast<int*>(&a);
1 голос
/ 20 апреля 2013

Стандартный способ повторной интерпретации битовых комбинаций состоит в использовании memcpy. Если я правильно помню, gcc разрешает приведение типа указателя *(int*)&a как расширение, но это не гарантируется стандартом и не работает со всеми компиляторами. Точно так же профсоюзы не гарантированно работают.

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

float f = -1.234;
int i;
memcpy(&i, &f, sizeof i);
printf("bit pattern is: %d\n", i);

С оптимизацией вызов memcpy будет полностью исключен из сгенерированного машинного кода.

0 голосов
/ 05 июля 2016

Если вам нужно преобразовать простое значение без дополнительной переменной:

#define float_to_int(f) (*reinterpret_cast<const int*>(&static_cast<const float&>(f)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...