Я получаю огромные различия, когда я передаю поплавок из C # в C ++.
Я передаю динамическое плавание, которое меняется со временем.
С помощью отладчика я получаю это:
c++ lonVel -0.036019072 float
c# lonVel -0.029392920 float
Я установил для моей модели MSVC ++ 2010 с плавающей точкой значение / fp: fast, которое должно быть стандартом в .NET, если я не ошибаюсь, но это не помогло.
Теперь я не могу выдать код, но могу показать его часть.
Со стороны C # это выглядит так:
namespace Example
{
public class Wheel
{
public bool loging = true;
#region Members
public IntPtr nativeWheelObject;
#endregion Members
public Wheel()
{
this.nativeWheelObject = Sim.Dll_Wheel_Add();
return;
}
#region Wrapper methods
public void SetVelocity(float lonRoadVelocity,float latRoadVelocity {
Sim.Dll_Wheel_SetVelocity(this.nativeWheelObject, lonRoadVelocity, latRoadVelocity);
}
#endregion Wrapper methods
}
internal class Sim
{
#region PInvokes
[DllImport(pluginName, CallingConvention=CallingConvention.Cdecl)]
public static extern void Dll_Wheel_SetVelocity(IntPtr wheel,
float lonRoadVelocity, float latRoadVelocity);
#endregion PInvokes
}
}
И на стороне C ++ @ exportFunctions.cpp:
EXPORT_API void Dll_Wheel_SetVelocity(CarWheel* wheel, float lonRoadVelocity,
float latRoadVelocity) {
wheel->SetVelocity(lonRoadVelocity,latRoadVelocity);
}
Так что любые предположения о том, что я должен делать, чтобы получить результаты 1: 1 или по крайней мере 99% правильных результатов.
Я считаю, что это может описать вашу проблему, http://msdn.microsoft.com/en-us/library/c151dt3s.aspx
Я рекомендую выбрать другой тип данных, если это возможно.
Поплавки могут меняться от одной программы к другой или даже в пределах одного и того же приложения.
Вот некоторые чтения по этому вопросу: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
Таким образом, вы можете реализовать подход «NearEqual» или просто выбрать другой тип данных.
До сих пор не нашли способ полностью решить мою проблему, но для тех, у кого, возможно, возникла та же проблема, настройка / fp: fast и / arch: SSE2 сделала меня намного ближе!
Мои результаты отладки, где моя проблема произошла:
latRoadVelocity -0.15862428 float
lonRoadVelocity -0.036250707 float
wheel->latRoadVelocity -0.15102120 float
wheel->lonRoadVelocity -0.036250707 float
как вы можете видеть, моя lonRoadVelocity в настоящее время составляет 1: 1, но все еще есть небольшая разница в latRoadVelocity. Посмотрим, смогу ли я получить это тоже 1: 1 как.