Как правильно передать float из C # в C ++ (dll)

Я получаю огромные различия, когда я передаю поплавок из 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% правильных результатов.

4

Решение

Я считаю, что это может описать вашу проблему, http://msdn.microsoft.com/en-us/library/c151dt3s.aspx

Я рекомендую выбрать другой тип данных, если это возможно.

Поплавки могут меняться от одной программы к другой или даже в пределах одного и того же приложения.
Вот некоторые чтения по этому вопросу: http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

Таким образом, вы можете реализовать подход «NearEqual» или просто выбрать другой тип данных.

0

Другие решения

До сих пор не нашли способ полностью решить мою проблему, но для тех, у кого, возможно, возникла та же проблема, настройка / 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 как.

0

По вопросам рекламы [email protected]