C++ C++;gdb中的静态_cast返回与gcc不同的结果

C++ C++;gdb中的静态_cast返回与gcc不同的结果,c++,gcc,gdb,double,C++,Gcc,Gdb,Double,我正在调查一个问题,当静态_长双对双转换时,gcc和gdb的奇怪行为。我有如下代码: const double xDelta = 60.0; int xSplits = 3; const long double xStepL = static_cast<long double>(xSplits) / xDelta; const double xStep = static_cast<double>(xStepL); 知道结果为什么不同吗?我真的希望它是第二个。有人知道如何

我正在调查一个问题,当静态_长双对双转换时,gcc和gdb的奇怪行为。我有如下代码:

const double xDelta = 60.0;
int xSplits = 3;
const long double xStepL = static_cast<long double>(xSplits) / xDelta;
const double xStep = static_cast<double>(xStepL);
知道结果为什么不同吗?我真的希望它是第二个。有人知道如何做到这一点吗


顺便说一句,我使用的是GCC4.3.4和GDB7.2.50。

我认为问题在于,
静态类型转换
没有使用相同的值调用。代码中的值将使用更高精度的寄存器值调用,而从gdb调用的值将在内存中使用长双精度。我不确定编译器可以在什么地方这样做,但我猜这是一个——因此答案可能会相差一个elp。

这看起来像是gdb中的一个bug

long double
转换到
double
的指令是
fldt
(十字节浮点加载),后跟
fstpl
(8字节浮点存储)。执行精简精度浮点存储时,它将对操作数进行四舍五入,从
0.0500000000000000000067762635780344
0.05000000000000003
。看起来gdb正在截断操作数,从
0.0500000000000067762635780344
0.049999999996
。浮点十六进制:

0x1.99999999999999999999ap-5 -> 0x1.999999999999ap-5 (gcc, correct)
0x1.99999999999999999999ap-5 -> 0x1.9999999999999p-5 (gdb, incorrect)

表示在gdb(7.4.50)的最新版本中已修复此问题。

您所说的“更高精度寄存器值”到底是什么意思?我还试验了GCCs _ufloat128类型,结果也遇到了同样的问题。通常,使用double的计算在高精度寄存器中执行,然后在存储回内存时切换回低精度。IIRC过去通常是80位中间值,但现在在64b处理器上可能会有所不同。
0.05
不能用二进制浮点表示,因此实际值将是
0.050000000003
0x1.9999999999999999 AP-5
)或
0.049999999999996
0x1.99999999999 p-5
)。较大的值更接近
0.05
0x1.9…ap-5
),因此您应该更愿意以该值结束。该值稍后将相乘并转换为整数作为内存访问的偏移量。不幸的是,在这种特殊情况下(这是测试用例和绝对边界)内存问题的可能解决方案包括测试边界和钳制(但这会在代码中引入分支),或在内存块末尾添加一个副本-但这仅在访问为只读时有效。我在一分钟前使用Debian Wheezy的7.4.1对其进行了测试,得到了相同(错误)的结果。我将在获得更新版本后立即证明。感谢您的回复。使用gdb的最新weekstone(7.4.50)对其进行了测试.如果它是一个错误,它是不固定的。同样错误的结果在这里。
0x1.99999999999999999999ap-5 -> 0x1.999999999999ap-5 (gcc, correct)
0x1.99999999999999999999ap-5 -> 0x1.9999999999999p-5 (gdb, incorrect)