Я разрабатывал приложение на C ++, которое взаимодействует с API-интерфейсами Windows Sensor через COM.
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318953(v=vs.85).aspx
Я на самом деле портирую приложение C #, которое я написал до этого, которое использует API-интерфейс Windows Sensor через WinRT API.
http://msdn.microsoft.com/en-us/library/ie/windows.devices.sensors
Приложение C # использовало датчик инклинометра для извлечения значений Pitch, Roll и Yaw системы в качестве значений с плавающей запятой (float 32bit).
В C # я создал бы датчик инклинометра, установил бы интервал между отчетами на минимально допустимый, а затем получил бы события обратного вызова через функцию 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 быть виновником удаления точности с плавающей запятой?
Я посмотрел вокруг, можно ли установить точность самих датчиков, но для этого нет никаких настроек. (Я попробовал свойства точности и разрешения без удачи).
РЕДАКТИРОВАТЬ:
Я использую std :: cout для печати значений. Я проверил, была ли это рутина печати, напечатав жестко закодированный поплавок с большей точностью, и он напечатал правильно. Я также вошел в отладчик и посмотрел на значение там, и они были в формате: #. # 000000 # (например, -2.70000005).
Задача ещё не решена.