版权声明:转载请说明Zhonglihao原创 https://blog.csdn.net/xeonmm1/article/details/83717224
// half_float_verify.cpp : 定义控制台应用程序的入口点。
// by Zhonglihao 2018
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
//强制裁掉指数位的低16位
unsigned short FloatToShort(float x)
{
unsigned short y;
y = (unsigned short)((*(unsigned int *)(&x)) >> 16);
return y;
}
//恢复为32位
float ShortToFloat(unsigned short x)
{
float y;
unsigned int temp;
temp = ((unsigned int)(x << 16));
y = (float)(*((float *)(&temp)));
return y;
}
int _tmain(int argc, _TCHAR* argv[])
{
unsigned short i;
float arr[65536] = { 0 }; //存放 0 - 65536的浮点数
float full_float_num;
float half_float_num;
//循环产生 0 - 65536 数值
for (i = 0; i <= 0xffff; i++)
{
//打印循环的值
printf("%f\n", (float)i);
//除以一个整数以变为小数
full_float_num = (float)i / 1000.0;
//将浮点值的低16位剪裁,并从16位存储转为浮点
half_float_num = ShortToFloat(FloatToShort(full_float_num));
//观察误差情况
arr[i] = half_float_num - full_float_num;
if (i == 0xffff) break;
}
//写入误差结果到excel文件
FILE *fp = NULL;
errno_t err;
err = fopen_s(&fp, "C:\\Users\\Administrator.5UPANNKI9OCMVXP\\Desktop\\test0825\\test.xls", "w");
for (i = 0; i <= 0xffff; i++)
{
fprintf(fp, "%f\n", arr[i]);
if (i == 0xffff) break;
}
fclose(fp);
//system("Pause");
return 0;
}
输出的excel,观察机械截断低16位的float误差: