【问题标题】:How to correctly pass a float from C# to C++ (dll)如何正确地将浮点数从 C# 传递到 C++ (dll)
【发布时间】:2014-07-21 09:28:13
【问题描述】:

当我将浮点数从 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% 正确结果的建议。

【问题讨论】:

  • 您是否尝试过标记您的浮点值 volatile ?或者您是否尝试过使用静态值来执行此操作?
  • 这样吗?公共易失性浮动 lonVel;公共易失性浮动 latVel;公共无效SetVelocity(浮动lonRoadVelocity,浮动latRoadVelocity){lonVel = lonRoadVelocity; latVel = latRoadVelocity; Sim.Dll_Wheel_SetVelocity(this.nativeWheelObject,lonVel,latVel); } 这样它没有帮助
  • 如果差异真的很大就好了。不是,对此没有简单的解释,只是您对 C# 代码实际传递的值感到困惑。
  • 对于这么大的差异,这段代码没有合理的解释。缺少的部分太多,无法弄清楚它可能是什么。请提交一个最小可行的例子,充分展示你在做什么。否则我认为这个问题应该关闭。
  • 汉斯,数字确实不是很大,但实际上差异本身是相当大的。 0.006626152 的一小部分在传递过程中丢失。 Wich 是 20.25...% 的差异,如果是 1%,那么差异不会太大,但 20% 实际上是相当大的。大卫,很抱歉我不能给出整个代码,但要点保持不变,如果你传递一个动态变化的浮点数,值会变得混乱,你可以用一个简单的基于时间步长的小计时器来试试这个,然后传递这个浮动通过相同的过程(从 C# 到带有 dll 的 C++),你应该面临同样的问题。

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


【解决方案1】:

我相信这可以描述您的问题,http://msdn.microsoft.com/en-us/library/c151dt3s.aspx

如果可能,我建议选择其他数据类型。

浮点数可以从一个程序更改为另一个程序,甚至可以在同一个应用程序中更改。 以下是有关该主题的一些读物:http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

因此,您既可以实现“AlmostEqual”方法,也可以简单地选择另一种数据类型。

【讨论】:

  • 嗯,很有趣。但实际上 C# 方面并不那么重要。我只需要将一些 C# 浮点数传递给 C++。我以前在 C++ 中看到过一些自定义数据类型,但不熟悉这些,所以在 C++ 上执行此操作(自定义数据类型,即 mfloat 而不是 float)会有帮助吗?
【解决方案2】:

仍然没有找到完全解决我的问题的方法,但是对于可能遇到相同问题的其他人,设置 /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 的方式得到这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-16
    • 2020-02-04
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    相关资源
    最近更新 更多