当前位置: 首页 > 编程语言 > C#

C++-C#与float、double的区别分享

时间:2023-04-10 23:57:44 C#

C++/C#与float、double的区别我们正在将一个C++数学库转为C#。该库混合了浮点数和双精度数(有时在它们之间进行转换),我们也在尝试这样做,以便在C#中获得与在C++中完全相同的结果,但事实证明即使不是不可能,也是非常困难的。我认为问题出在以下一个或多个问题上,但我不是专家:将浮点数转换为双精度数并将双精度数转换为浮点数会导致不可预测的结果,并且在C++和C#中的处理方式不同C+++和C#处理浮点精度的方式不同,他们不能互相模仿.NET中有一个设置可以使它的行为像C++,但我找不到它(都是32位)有人可以向我解释什么可能是现有问题,也许可以将我链接到一些我可以使用来自Microsoft的权威文档来帮助解释这种情况以及为什么会出现差异?编辑我们使用的是VC6和.NET4.0由于NDA,我无法给出计算示例,但我可以显示一些差异数字......它们本身可能毫无用处:8.085004000000000(C#)vs.8.084980000000000(C++)8.848165000000000(C#)vs.8.848170000000000(C++)0.015263214111328(C#)vs.0.015263900756836(C++)应该注意的是,这些数字包括复杂的问题。这些是计算结果。C++允许程序为临时结果保留比子表达式暗示的更高的精度。可能发生的一件事是中间表达式(或它们的未指定子集)被评估为扩展的80位浮点数。另一方面,如果这在C#中有效,我会感到惊讶,但即使它有效,C#编译器也不必选择相同的表达式子集来评估为80位扩展浮点数。编辑:请参阅下面埃里克的评论。更多细节相同中间精度问题的另一个实例是编译器使用fmadd指令进行乘法,然后将其添加到源代码中(如果目标体系结构具有它-例如,PowerPC)。fmadd指令准确计算其中间结果,而正常加法会舍入中间结果。为了防止C++编译器这样做,您应该只需要将浮点计算编写为使用volatile变量的中间结果的三地址代码。如果这个转换改变了C++程序的结果,就意味着上面的问题在起作用。但是随后您更改了C++端的结果。如果不读取生成的程序集,您可能无法在C#中获得完全相同的旧C++结果。如果它有点旧,您的C++编译器还可以优化浮点计算,就好像它们没有链接一样。你无能为力。这是不正确的。三地址转码将再次阻止编译器应用它,但C#编译器也没有简单的方法来重现旧的C++结果。以上就是C#学习教程的全部内容:C++/C#与float、double的区别。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: