2013-08-21 4 views
2

Я запускаю простую программу на 64-битной машине Cnetos 6.2.0.typecasting long to float using gcc libraries

int main() 
{ 

int b = 1078085270;//1078085218; 
float a; 
a = (float)(b); 

printf("val of a is %f\n",a); 

return 0; 
} 

Выходной сигнал а является 1078085248. я изменил значение 1078085218. еще получил тот же результат. Я не могу понять, почему или как результат поврежден или изменен?

Может ли кто-нибудь объяснить, пожалуйста?

+3

'float' не имеет такой высокой точности. – Mysticial

+0

Прочитайте статью [Wikipedia] (http://en.wikipedia.org/wiki/IEEE_floating_point) о том, как ваша машина обрабатывает числа с плавающей запятой, а затем задумайтесь над своим вопросом. – fuz

+0

Моя машина имеет 4 байта для хранения данных типа float. Не могли бы вы сообщить мне, как я могу узнать точную точность поплавка? –

ответ

4

Посмотрите на количество 1078085270 в двоичной системе:

b1000000010000100100011010010110 

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

b100000001000010010001101 0000000 
b100000001000010010001110 0000000 

(пробелы указывают на разрыв между 24-й и 25-й цифры, точка, в которой число округляется). Поскольку ваш номер ближе к первому числу, он округляется до этого значения, которое равно 1078085248 в десятичном значении.

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