- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
#include <stdio.h>
#include <inttypes.h>
int main(void) {
float a = 0;
float b = -9.8 * 0;
uint32_t* pa = (void*)&a;
uint32_t* pb = (void*)&b;
printf("%li %li %i %f %f\n",pa[0] , pb[0], pb[0]>>31, b+0, b);
return 0;
}
rotoeb 16.08.2018 20:14 # −1
gost 16.08.2018 21:22 # +2
*Но с этой оптимизацией мы не можем хранить нулевую мантиссу (поскольку считаем, что целая единица есть всегда) - и, соответственно, у нас нет полноценного нуля. Поэтому в стандартном плавающем питухе считается, что если у числа и мантисса, и порядок равны нулю (т.е. все их биты нулевые, там ещё заморочки с представлением отрицательного порядка), то и само число равно нулю (хотя фактически, без этой оговорки, для 32-битного питуха это будет 1.0*2^-127). Из-за этого и получается, что плавающих нулей два — +0 и -0: бит знака-то никак не влияет на модуль числа, как это, к примеру, происходит в two's complement.
Мы, конечно, можем доопределить один из них под какое-то другое число, но это приведёт только к лишнему и бессмысленному усложнению схем FPU.
Читать подробнее: http://steve.hollasch.net/cgindex/coding/ieeefloat.html
guest8 16.08.2018 22:08 # −999