gdb中的C++static_cast返回的结果与gcc不同
C++ static_cast in gdb returns different result than gcc
我正在调查一个问题,当static_casting long double to 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);
基本上它除以3/60,所以结果应该是0.05。当使用简单的double
值进行操作时,xStep
的值为0.050000000000000003
,因此决定使用更高精度的12字节long double
。在上述例子中,xStepL
的值为0.05000000000000000000067762635780344
。当将该值强制转换回double
时,它实际上又是0.050000000000000003
。但是,当使用gdb检查值时,它会打印以下内容:
(gdb) p xStep
$1 = 0.050000000000000003
(gdb) p static_cast<double>(xStepL)
$2 = 0.049999999999999996
知道为什么结果不同吗?我真的希望它是第二个。有人知道如何做到这一点吗?
顺便说一句,我使用的是GCC 4.3.4和GDB 7.2.50。
我认为问题是static_casts
没有用相同的值进行调用。代码中的值将使用更高精度的寄存器值进行调用,而从gdb调用的值将在内存中使用长双精度。我不确定编译器可以这样做的确切位置,但我猜这是一个——所以答案可能会因帮助而有所不同。
这看起来像是gdb中的一个bug。
从long double
强制转换为double
的指令是fldt
(10字节浮点加载)和fstpl
(8字节浮点存储)。执行降精度浮点存储时,它将四舍五入操作数,从0.05000000000000000000067762635780344
变为0.050000000000000003
。看起来gdb正在截断操作数,从0.05000000000000000000067762635780344
变为0.049999999999999996
。以浮点十六进制表示:
0x1.99999999999999999999ap-5 -> 0x1.999999999999ap-5 (gcc, correct)
0x1.99999999999999999999ap-5 -> 0x1.9999999999999p-5 (gdb, incorrect)
讨论表明,这在gdb(7.4.50)的最新版本中得到了修复。
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 转换为标准时,Clang和GCC中的不同结果::可选<T>
- 为什么 std::locale( " " ).name() 在 clang 和 gcc 上给出不同的结果?
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- 未经GCC优化而编译的简单C++程序不会产生预期的结果
- 菱形层次结构中的虚函数重载在 clang 和 gcc 中产生不同的结果
- GCC 9.1 返回 void& 作为显式析构函数调用的结果类型。这是一个错误吗?
- 为什么 GCC 调用 libc 的 sqrt() 而不使用其结果?
- 使用 constexpr 函数的结果作为模板参数(clang vs gcc)
- 相同的AVX2程序在gcc和msvc中产生不同的结果
- 为什么 gcc 和 clang 为我的程序编译为不同的"const"结果?
- 用不同版本的Ubuntu上的GCC编译会产生不同的结果
- GCC:为什么编译.HPP文件与.cpp文件的结果不同
- 在 GCC 4.6 和 4.7 上模板模板扣除的两个不同结果
- 为什么不同的 GCC 4.9.2 安装为此正则表达式匹配给出不同的结果
- gdb中的C++static_cast返回的结果与gcc不同
- 编译一个相当简单的c++11程序时,gcc和clang之间的结果不同
- 将 C++11 正则表达式与 gcc 4.8.2 一起使用时会出现奇怪的结果(但适用于 Boost 正则表达式)
- 自分配中的后增量,VS2013和GCC之间的结果不同