long double から double への static_casting 時の 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
結果が異なる理由は何ですか?本当は2本目でお願いしたいです。誰でもそれを達成する方法を知っていますか?
ところで、私は GCC 4.3.4 と GDB 7.2.50 を使用しています。