当我将一个浮点数从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%的正确结果,我应该做些什么的消息。
答案 0 :(得分:0)
我相信这可能会描述您的问题,http://msdn.microsoft.com/en-us/library/c151dt3s.aspx
如果可能,我建议您选择其他数据类型。
浮动可以从一个程序更改为另一个程序,甚至可以在同一个应用程序中。 以下是关于该主题的一些阅读:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
因此,您可以实现“AlmostEqual”方法,也可以只选择其他数据类型。
答案 1 :(得分: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的方式得到这个。