【发布时间】: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