gpt4 book ai didi

c# - float 问题 : C++ to C# migration

转载 作者:行者123 更新时间:2023-11-28 07:09:15 25 4
gpt4 key购买 nike

我正在从事 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# 中生成的二进制文件有所不同。即使我在调试时(在写入文件之前)比较这些值,我也会得到不同的答案。

现在我需要向我的客户解释为什么不同。

有人可以告诉我为什么不同吗?

据我所知,C++在进行浮点运算时生成的临时对象精度更高。

还有其他要点吗?这样我就可以通过告诉“C++ 处理 float 的方式与 C# 不同”来辩护或者我可以修改 C# 程序以匹配 C++ 输出吗?是否可以?此外,我无法修改 C++ 遗留代码。我需要在 C# 中获得相同的结果。可能吗?

最佳答案

事实是:

  • 此函数在给定正常程序输入的情况下,在 C++ 和 C# 中返回不同的输出,并且
  • 此函数在 C++ 和 C# 中返回相同的输出,给定受控的相同输入

建议:

  • 此函数的正常程序输入在 C++ 和 C# 中是不同的。

关于后者,OP 在评论中指出“我还使用 C++ 和 C# 创建了一个示例测试应用程序并对输入进行了硬编码。通过对 doubleToInt 函数的输入进行硬编码,我得到了相同的结果。”这表明,给定相同的输入,函数的 C++ 和 C# 版本返回相同的输出。我们可以从中推断出不同输出的原因是不同的输入。

OP 还指出“在调试时,为了比较结果,如果我看到 C++ 和 C# 的输出,对于同一组值,它是不同的。”然而,这是不确定的,因为调试器和打印语句用于调试通常不会打印浮点对象的完整、准确的值。通常,它们四舍五入到六位有效数字。例如,一个简单的 std::cout << x将 10000.875 和 10000.9375 显示为“10000.9”,但它们是不同的数字,并且会在 doubleToInt 中产生不同的输出。 .

总之,问题可能出在程序的早期工作上,在 doubleToInt 之前被调用,遇到浮点舍入或其他错误并将不同的值传递给 doubleToInt在 C++ 和 C# 版本中。要对此进行测试,请将精确 输入打印到 doubleToInt看看它们在两个版本中是否不同。

精确地打印输入可以通过以下方式完成:

  • 使用 %a格式,如果您的实现支持的话。 (这是一个 C 特性,用于以十六进制浮点表示法打印浮点值。一些 C++ 库在使用 printf 时支持它。)
  • 设置非常高的精度并打印,与std::cout.precision(100)一样.某些 C++ 实现可能仍然无法打印出准确的值(这是一个质量问题),但它们应该打印出足够多的数字以将准确值与相邻的 double 区分开来。值(value)观。
  • 打印值表示的字节(通过将指向浮点对象的指针转换为指向 unsigned char 的指针并打印单个 char 对象)。

根据提供的代码,问题不太可能是 doubleToInt 中的浮点问题.语言定义允许在浮点计算中有一些松弛,所以理论上可能 d+.1以过高的精度评估,而不是正常的 double精度,然后转换为intshort .但是,这只会在极少数情况下导致不同的结果,其中 d+.1double 中评估精度四舍五入为整数,但 d+.1以超额精度评估的结果仍然略低于整数。这需要大约 38 位(double 有效数中的 53 位减去整数部分中的 16 位加上舍入的一位)具有特定值,因此我们预计它仅在 2750 亿次中偶然出现约 1 次(假设均匀分布是一个合适的模型)。

事实上,添加 .1 向我暗示有人试图更正他们预期为整数的结果中的浮点错误。如果某人有一个“自然”值,他们试图将其转换为整数,通常的做法是四舍五入到最接近的值(如 std::round ),或者有时截断。添加 .1 表明他们正在尝试计算他们预期为整数的值,但由于浮点错误而得到 3.999 或 4.001 之类的结果,因此他们通过添加 .1 和截断来“更正”它。因此,我怀疑程序早期存在浮点错误。也许它们在 C# 中更加严重。

关于c# - float 问题 : C++ to C# migration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21274211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com