gpt4 book ai didi

visual-studio-2010 - 为什么我在调试和 Release模式之间出现算术差异,我该如何解决?

转载 作者:行者123 更新时间:2023-12-05 00:03:20 26 4
gpt4 key购买 nike

在我的程序中,这个片段:

  trace.log(
String.Format("a= {0:R} b= {1:R} a<b= {2}",
b.GetPixel(447, 517).GetBrightness(), (100F / 255F),
b.GetPixel(447, 517).GetBrightness() < (100F / 255F))
);

在 Debug\prog.exe 中输出:
 a= 0.392156869 b= 0.392156869 a<b= False

但这不同的结果在 Release\prog.exe 中:
 a= 0.392156869 b= 0.392156869 a<b= True

谁能解释为什么相同的操作数会给出不同的比较结果?并推荐一种补救措施,理想情况下是程序范围的,例如编译器开关?谢谢。

编辑: 澄清:以上结果来自于在 Windows 资源管理器中启动 Debug\prog.exe 和 Release\prog.exe。

编辑: 更多信息:从 VS 执行,"Start Debugging"给出 False(即准确的结果,与 WE-launched Debug\prog.exe 相同),而“Start without debugging”给出 True(即不准确的结果,与 WE-launched Release\prog 相同) 。可执行程序。

编辑: 替代测试用例 用文字代替

这两种情况
  trace.log(
String.Format("a= {0:R} b= {1:R} a<b= {2}",
0.392156869F, 0.392156869F,
0.392156869F < 0.392156869F)
);
trace.log(
String.Format("a= {0:R} b= {1:R} a<b= {2}",
0.392156869F, (100F / 255F),
0.392156869F < (100F / 255F))
);

在调试和发布输出中显示没有差异。这个案例:
  trace.log(
String.Format("a= {0:R} b= {1:R} a<b= {2}",
b.GetPixel(447, 517).GetBrightness(), 0.392156869F,
b.GetPixel(447, 517).GetBrightness() < 0.392156869F)
);

显示与原始测试用例相同的差异(和版本中的不准确性)。

编辑:迟到的 演示问题的最小测试用例
Color c = Color.FromArgb( 255, 100, 100, 100 );
trace.log(
String.Format("a= {0} b= {1} a<b= {2}",
c.GetBrightness(), 0.392156869F,
c.GetBrightness() < 0.392156869F)
);

在 Debug\prog.exe 中输出这个正确的结果:
 a= 0.392156869 b= 0.392156869 a<b= False

但是这个不正确的结果在 Release\prog.exe 中:
 a= 0.392156869 b= 0.392156869 a<b= True

编辑: 补救措施

1)从下面彼得的回答:
trace.log(
String.Format("a= {0:R} b= {1:R} a<b= {2}",
c.GetBrightness(), 0.392156869F,
c.GetBrightness().CompareTo(0.392156869F)<0)
);

2) 来自提问者 ChrisJJ ( 已更新 ):
float comp = c.GetBrightness();
trace.log(
String.Format("a= {0:R} b= {1:R} a<b= {2}",
comp, 0.392156869F,
comp < 0.392156869F)
);

我认为这增加了 Release模式编译器错误的证据。

最佳答案

这很可能是 Debug模式和 Release模式之间的不同浮点规则的结果(见 herehere )。

更新:

感谢您对该问题的新更新,我能够在我的机器(64 位 Windows)上重现该问题。这似乎仅在将平台设置为 X86 时发生; X64 和 AnyCPU 平台在 Release模式下显示正确的结果。可能,当平台是 X86 时,公共(public)语言运行时在 64 位机器中应用 X86 仿真,并且显然在比较运算符中搞砸了。

但是,我找到了一种可能的解决方法:使用 CompareTo 而不是 "<"和 ">"运算符,如下所示:

c.GetBrightness().CompareTo(0.392156869F)<0

在我的机器上,这将在 X86 中提供与在 X64 和 AnyCPU 中相同的正确结果。

关于visual-studio-2010 - 为什么我在调试和 Release模式之间出现算术差异,我该如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086347/

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