// 本文不完全是原创,只是整合了一些知识和观点和自己的测试代码,对与错仅供参考。
计算空间几何变换和动画中经常使用的浮点数宏符号的含义:
float fSValue = 1.0e-07;//等于1.0e-07,1.00e-07,1e-7,等价于1.0 * 10^-7
float fValue = -1.0e-7;// -1.0e-7等价于-1.0 * 10 ^-7
const double EPSILON = 1.00e-07;
const float FLT_EPSILON = 1.192092896e-07F;
const double DBL_EPSILON = 2.2204460492503131e-016;
// 计算机底层数字转换:
//1.10进制转换为n进制,正数除以进制,倒转取余(通过16进制和2进制转换更方便);小数乘以进制数,顺序取整。//2.N进制数转换为10进制数,Ax(2^1) + Bx(2 ^0) + Cx(2^-1)数列形式表示,无论正数负数都一样。
//3.浮点数表示:符号位,指数位(0-127表示负数,(127-256)表示正数),尾数(去掉前面一位)。
//4.大于1Byte的数字和非数值类型,都要进行小端模式排序存放(对于一个单位结构转换后才能得到正确的值)。
// 整数是直接转换为16进制表示(存储转换为小端模式存储),浮点数需要按照转换公式和特殊公式处理(存储转换为小端模式存储),
// 非数值数据,例如ASCII字符,Unicode会转换为相应的字节代码,或者双字节代码来代替;二进制非数值数据存储, 都可以转换为ASCII,UTF-8表示,
// 会索引到文字的图形贴图或者计算的像素。汉字Ascii为负数,那是解析错误,因为汉字有自己的编码,但是存储和显示出来都是对的。
// 图形数据,颜色像素数据,可以用unsigned int表示,32位,每字节表示一个颜色值,将图形数据提交到显卡,显卡会映射为对应的颜色值。
// 1.浮点数的表示
//小数的处理:
//0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
//实际上这永远算不完!这就是著名的浮点数精度问题。
//1)浮点数表示为十六进制数
// 公式:将浮点数化为:Sx(2^E)xF 后转换为:(-1)Sx(2^(E + 127))x(F - 1),得到S+(E+127)+(F-1)的二进制数,也就是十六进制数。
// 浮点数表示格式:float:符号位(1) 指数位(8) 尾数位(23); double:也是类似的方式,只是位数不同。
// 对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字F。
// 符号位为0则是正数,1则是负数。
//指数位需有负数不用[-128,127]而用[0,255]表示,负数在[0,127],正数在[128,255]
//尾数的前面都是1.1000,因为没有0.11000,故前面可以省略1
// 特殊情况公式转变(表示正负0或者比2^(-127)更小的小数):当用上面的的公式转换后发现:二进制科学计数法得到真实的 E <= -127,那么转换为十六进制时取0x00; F变为0.xxx形式,首位为0舍去,
// 后面的位数为xxx,符号位还是S.
/*转换函数
string DigitalData::TestFloat(float fData)
{
unsigned char *pData = (unsigned char*)&fData;
char szBuffer[32];
//再转化为16进制为:47 F1 20 00,最后把它翻过来,就成了:00 20 F1 47。
unsigned char Tail = *(pData);
unsigned char Tail2 = *(pData + 1);
unsigned char Exp = *(pData + 2);
unsigned char Head = *(pData + 3);
sprintf_s(szBuffer, "%02x%02x%02x%02x", Head, Exp,Tail2, Tail);
//printf(szBuffer);
return string(szBuffer);
}
*/ <