Другой случай для новый - то, что я называю Фу Кодирование . Винни-Пух следует за животиком. Я говорю, идут с язык, который Вы используете, не против это.
Возможности состоят в том, что специалисты по обслуживанию языка оптимизируют язык для идиом, которые они пытаются поощрить. Если они помещают новое ключевое слово на язык, они, вероятно, думают, что имеет смысл быть ясным при создании нового экземпляра.
Код, записанный следующий за намерениями языка, увеличится в эффективности с каждым выпуском. И код, избегающий ключевых конструкций языка, пострадает со временем.
РЕДАКТИРОВАНИЕ: И это подходит вне производительности. Я не могу считать времена, которые я услышал (или сказал), "какого черта они делали это ?" при нахождении странно выглядящего кода. Часто оказывается, что в то время, когда код был записан, была некоторая "хорошая" причина его. После дао языка Ваша лучшая страховка для того, чтобы не высмеивать Ваш код несколько лет с этого времени.
Чтобы на самом деле интерпретировать его, вы, вероятно, в любом случае не захотите рассматривать его как байты, потому что границы мантисы не совпадают с 8-битной границей.
Что-то вроде:
mantisa = (*(unsigned int *)&floatVal) | MANTISA_MASK;
exp = ((*(unsigned int *)&floatVal) | EXP_MASK ) >> EXP_SHIFT;
sign = ((*(unsigned int *)&floatVal) | SIGN_MASK ) >> SIGN_SHIFT;
Будет позвольте вам разобрать его, чтобы поиграть с центром сока.
EDIT:
#include <stdio.h>
void main()
{
float a = 4;
unsigned int exp,sign,mantisa;
int i;
for(i = 0;i<4;i++)
{
exp = (*((unsigned int *)&a) >>23) & 0xFF;
sign = (*((unsigned int *)&a) >>31) & 0x01;
mantisa = (*((unsigned int *)&a)) & 0x7FFFFF | 0x800000;
printf("a = %04x\r\n",*((unsigned int *)&a));
printf("a = %f\r\n",a);
printf("exp = %i, %02x\r\n",exp,exp);
printf("sign = %i, %02x\r\n",sign,sign);
printf("mantisa = %i, %02x\r\n\r\n",mantisa,mantisa);
a = -a / 2;
}
}
Производит:
a = 40800000
a = 4.000000
exp = 129, 81
sign = 0, 00
mantisa = 8388608, 800000
a = c0000000
a = -2.000000
exp = 128, 80
sign = 1, 01
mantisa = 8388608, 800000
a = 3f800000
a = 1.000000
exp = 127, 7f
sign = 0, 00
mantisa = 8388608, 800000
a = bf000000
a = -0.500000
exp = 126, 7e
sign = 1, 01
mantisa = 8388608, 800000
Press any key to continue . . .
Try this link: http://en.wikipedia.org/wiki/IEEE_754
I just found that this might be a little more helpful: http://en.wikipedia.org/wiki/IEEE_754-1985
This is the IEEE-Standard for floating point numbers. There is one from 1985 and a revised edition from 2008. Float is 32bit, double is 64bit (explained in the second link).
Edit: Thx to the comment by Don, here's the link to Intels 80bit floating point description: http://en.wikipedia.org/wiki/Extended_precision
Также стоит отметить, что есть член static bool const
в std :: numeric_limits
, is_iec559
, который, естественно, доступен только для типов с плавающей запятой. Название говорит само за себя ...