1

编辑:我编写了与在家工作时相同的代码来重新创建错误。这是确切的代码!

我正在尝试将浮点数从 c++ 传递给 c#,并且我使用 c++ CLI 作为中间。我在 C++ cli 中有以下功能

void myclass::getFloats(float% f1, float %f2)
{
    float f11=734212.384f;
    float f22=467474.26675f;
    f1=f11;
    f2=f22;
}

当我在函数末尾放置一个断点并停在那里时,我看到:

  • f1 持有:734212.38
  • f2 持有:467474.28

由于浮点限制,我认为没关系。

但是当范围结束并且我返回到调用这个函数的 c# 代码时,它看起来像这样:

myclass m = new myclass();
float f1=0, f2=0;
m.getFloats(ref f1, ref f2);

我在 getFloat 函数之后停下来,我看到了。

  • f1 持有 734212.4
  • f2 持有 467474.281

我不知道为什么会发生这种情况,为什么在第一个数字中他四舍五入 0.38 到 0.4 而在第二个数字中他没有并且只是添加了 0.001 ?

任何帮助将不胜感激,在此先感谢

4

2 回答 2

0

您遇到了 32 位浮点的精度限制。我会改变double,看看你的“问题”是否消失。

你的号码是

float f22=467474.26675f;

最接近的浮点表示是

48E44249   467474.28125

您看到的调试显示"467474.28""467474.281"都是显示此值的合理方式。

下一个可表示的数字是

48E4424A   467474.3125

您在评论中表达的想法是舍入误差大约为0.00000010.5 到 1.0 之间的值才适用。一般来说,舍入误差将在0.0000001 * value.

于 2013-08-20T21:09:29.157 回答
0

我认为这是由浮点模式引起的。在原生 C++ 中,我们可以使用编译器选项 /fp 来指定 3 种浮动模式:快速、精确、严格。默认情况下,原生 C++ 项目使用 fp:precise; 而根据这篇文章,托管代码使用相当于 fp:fast 的东西。虽然 fp:fast 的精度低于 fp:precise,但我认为这就是问题的原因。

您可以尝试在本机 C++ 中指定 fp:fast 以查看是否可以修复此问题。

仅供参考,Microsoft Visual C++ 浮点优化

于 2013-08-21T13:08:44.957 回答