读书人

为何D3D中CreateDevice之后浮点数计算

发布时间: 2012-11-03 10:57:43 作者: rapoo

为什么D3D中CreateDevice之后浮点数计算出现很大误差
很简单的一段代码,在多个项目中测试,只要有这一句代码就会出问题

C/C++ code
    {        double ddd=106002223;        ddd/=100;        char szBuf[64];        sprintf(szBuf,"%f",ddd);        MessageBox(NULL,szBuf,"",0);    }    //创建设备    if(D3D_OK!=g_pD3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,        D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dpp,&g_pD3DDevice))    {    MessageBox(NULL,"创建设备失败!","失败!",MB_OK|MB_ICONERROR);    return E_FAIL;    }    {        double ddd=106002223;        ddd/=100;        char szBuf[64];        sprintf(szBuf,"%f",ddd);        MessageBox(NULL,szBuf,"",0);    }

以上2次的结果分别为:1060022.23和1062222.25,这个误差是不是太大了一点,不是说DOUBLE型的精度是在15到16位吗?
当然最主要的是为什么创—3D设备前后会有这么大的差别?

[解决办法]
FPU的方式被修改
注意第四个参数, 有个 D3DCREATE_FPU_PRESERVE MSDN这个有说明

Indicates that the application needs either double-precision floating-point unit (FPU) or FPU exceptions enabled. Microsoft® Direct3D® sets the FPU state each time it is called.
By default, the pipeline uses single precision. Be sure to use this flag to get double precision. Setting the flag will reduce Direct3D performance.


读书人网 >VC/MFC

热点推荐