如何正确地将一个浮点数从C#传递给C ++(dll)

时间:2014-05-31 21:19:55

标签: c# c++ floating-point floating-point-conversion

当我将一个浮点数从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%的正确结果,我应该做些什么的消息。

2 个答案:

答案 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的方式得到这个。