【发布时间】:2020-07-01 01:03:43
【问题描述】:
我尝试使用 GDB 来查看“幕后”这段代码发生了什么。
目前我的 GDB 仅在 linux 终端中工作,并且如标题所述,每当我在这里运行此代码时,我都会得到预期的(逻辑)输出。
我认为问题在于return 来自func()。
在cmd 中运行相同的代码会给出“不相等”,而在terminal 中会给出“相等”。
为什么会这样?
我使用gcc编译代码
代码如下:
#include <stdio.h>
double func(){
double y= 5 ;
return (double)y/3;
/*// Code that works as expected:
double y= (double)5/3;
return y;
*/
}
int main()
{
double x ;
x= (double)5/3;
if (x == func())
printf("%lf equal to %lf\n", x ,func());
else
printf("%lf not equal to %lf\n", x, func());
return 0;
}
【问题讨论】:
-
欢迎来到floating point math。两个系统上的
x和func()有什么区别?这就是你开始弄清楚这一点的地方。它可能是小得离谱但非零的东西,比如 1e-29。 -
@tadman 所以 cmd 以不同于终端的方式解释双变量。但即便如此,我认为在 cmd 中
func()和x的处理方式相同,因为它们都是double数据类型。 -
您在 Windows 构建中使用什么工具链?将有一个调试器。在任何情况下,你都可以在 Windows 中使用 GDB(如果使用 MinGW)。
-
我在 cmd 中使用
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)运行它,它工作正常,结果是equal to。 -
这不是
cmd的函数,可能与您的编译器或编译器设置有关。double既可以表示为寄存器(通常为 80 位),也可以表示为 64 位的内存值。在这两者之间转换可能会导致值的微小差异,这意味着它们不是“等效的”。编译器优化也可以在这里发挥作用,在任何给定情况下以最有效的方式表示它。
标签: c debugging cmd terminal gdb