【发布时间】:2014-01-22 04:30:18
【问题描述】:
我正在做一个 C++ 到 C# 的迁移项目。而且我遇到了一个涉及浮点运算的问题。 在 C++ 中,有一个函数
int doubleToInt(double d)
{
return (int)(d >= 0.0 ? (d + 0.1) : (d - 0.1));
}
与我迁移到 C# 的函数相同(请注意,在 C++ 中,sizeof(int) 是 2 bytes。所以我使用 short 作为返回类型)
private static short doubleToInt(double d)
{
return (short)(d >= 0.0 ? (d + 0.1) : (d - 0.1));
}
在这个转换之后,我正在做一些操作并生成一个二进制文件。与 C++ 相比,C# 生成的二进制文件是不同的。即使我在调试时(在写入文件之前)比较值,我也会得到不同的答案。
现在我需要向我的客户解释为什么它不同。
Can someone give me inputs on why it is different?
据我所知,在 C++ 中进行浮点算术运算时生成的临时值具有更高的精度。
Are there any other points? So that I can defend by telling "The way C++ handles the floating point is different from C#
或者我可以修改 C# 程序以匹配 C++ 输出吗?是否可以?此外,我无法修改 C++ 遗留代码。我需要在 C# 中获得相同的结果。有可能吗?
【问题讨论】:
-
为什么不隔离结果不同的特定输入,并在此处发布?
-
虽然它是特定于实现的,但 C++
ints 通常是 32 位的,而 C#shorts 是 16 位的。 -
为什么在 C# 版本上使用
short(16bit) 而不是int(32bit)? -
@ನಿಶಿತ್ - 如果您使用非常罕见的目标平台,您应该明确说明...大多数平台的大多数现代 C++ 编译器使用 32 位
int。 -
这两个函数是否都在使用/生成托管代码?如果是这样,您可以编译到 MSIL 并发布代码吗?
标签: c# c++ c floating-point floating-point-precision