我一直在用C ++开发一个应用程序,它通过COM与Windows Sensor API连接 http://msdn.microsoft.com/en-us/library/windows/desktop/dd318953(v=vs.85).aspx
我实际上移植了一个我之前编写的C#应用程序,它通过WinRT API使用了Windows Sensor API。 http://msdn.microsoft.com/en-us/library/ie/windows.devices.sensors
C#应用程序使用Inclinometer传感器检测系统的Pitch,Roll和Yaw值为浮点值(浮点32位)。
在C#中,我将创建Inclinometer传感器,将报告间隔设置为允许的最小值,然后通过InclinometerReadingChanged函数获取回调事件。
现在在C ++中,我做了大致相同的事情(但是使用COM)。 COM界面为您提供了更改报告间隔和灵敏度的选项,而C#/。NET / WinRT界面则根据报告间隔设置自动设置灵敏度。我仍然将传感器值Pitch,Roll和Yaw值设置为32位浮点数,但精度已在第一个小数位被切断!
Created sensor manager.
Permission: 0
Created collection.
Got sensor count: 12
Got sensor (to test).
Supports event!
Min report interval: 15
Current Report interval: 50
Setting current report interval to minimum...
New Current Report interval: 15
Current Sensitivity: 0.5, 0.5, 0.5
Setting Sensitivity...
New Current Sensitivity: 0.01, 0.01, 0.01
Sensor started!
State changed!
Reading: -0.6, 0.8, 54.8
Reading: 2.7, 2.9, 53.4
Reading: 4.2, 3.9, 52.2
Reading: 4.2, 2.9, 51.9
Reading: 3.3, 2.3, 51.8
Reading: 2.3, 1.9, 51.7
Reading: 1.5, 1.6, 51.6
Reading: 0.9, 1.3, 51.6
Reading: 0.5, 1.2, 51.5
Reading: 0.2, 1.1, 51.5
Reading: 0, 1, 51.5
Reading: -0.1, 0.9, 51.5
Reading: -0.2, 0.9, 51.5
Reading: -0.3, 0.9, 51.5
Reading: -0.4, 0.8, 51.5
Reading: -0.5, 0.8, 51.5
Reading: -0.5, 0.8, 51.5
Reading: -0.5, 0.8, 51.5
Reading: -0.5, 0.8, 51.5
Reading: -0.6, 0.8, 51.5
Reading: -0.6, 0.8, 51.5
Reading: -0.6, 0.8, 51.5
C#应用程序没有这个问题。理论上,两个api(WinRT和Win32 / COM)从同一个底层系统获取数据。
COM能否成为消除浮点精度的罪魁祸首?
我环顾四周是否可以设置传感器本身的精度,但没有设置。 (我没有运气就试过了Accuracy and Resolution属性。)
修改
我正在使用std :: cout来打印值。我通过打印更精确的硬编码浮点并正确打印来测试是否是打印例程。我也进入了调试器并查看了那里的值,它们的格式为:#。#000000#(例如-2.70000005)。