为什么gfortran/gdb在调试时产生不同的数字结果?

问题描述:

我正在使用Code :: Blocks编译gfortran的一些数字代码。我有两个版本的可执行文件:Debug和Release。为什么gfortran/gdb在调试时产生不同的数字结果?

  • 调试编译标志:-Jobj\Debug\ -Wall -g -c
  • 版本的编译选项:-Jobj\Release\ -Wall -O2 -c
  • GDB invokation标志:-nx -fullname -quiet -args

当我正常运行的代码,无论是发布和调试可执行文件产生相同的输出。但是,当我运行代码gdb时,输出是不同的。这似乎是由于数值计算在执行过程中产生了不同的结果。

例如,当在gdb运行一个计算的结果是7.93941842553643E-06和正常运行时是1.71006041855278E-03。更奇怪的是,一些非零结果在双精度精度内是相同的。

我怎么能保证输出是一样的,当我运行使用gdb?使用gdb时,默认使用的是不同类型的数值计算或评估?

+0

您必须删除您的错误和未定义的行为。哪个?谁知道没有看到你的代码... –

+0

我编辑了原始问题,以反映这一事实,我相信我看到的行为是由于在使用gdb运行代码时计算数值的方式有所不同。 –

+0

那么计算如何呢? –

这似乎是由于生产过程中执行不同的结果的数值计算。

也就是说非常不大可能:GDB不参加你的程序执行的任何数值计算。

明显更可能的是,你的程序使用未初始化的内存,并且内存恰好在程序GDB下运行有不同的值。

如果你在一个受valgrind支持的平台上,你的第一步应该是在它下面运行你的程序,并修复它找到的所有错误。