#include <stdio.h>
#include <wchar.h>
int main()
{
double f = 1717.1800000000001;
wprintf(L"double %.20G\n", f);
return 0;
}
出力(以下予想):GCC二重のprintf精度 - 間違った出力
double 1717.1800000000000637
double 1717.1800000000001
これはUbuntuの11.10 x64である(しかし、32ビット用にコンパイルする場合)。
私が解決しようとする問題は、Windowsではコードのように数字を出力し、移植性の問題ではWindowsのように動作するように低レベルの書式設定(swprintf)を行う必要があるということです。
1717.1800000000001は正確には二重表現ではないので、 'f'の値の近くでしか値を取得できません。 fに格納される値は、正確に1717.180000000000063664629124104976654052734375です。問題は20がリクエストされたにもかかわらず、ウィンドウが17桁の有効数字だけを出力するようになったことです(既知のバグ、AFAIKはバグデータベースのどこかにあります)。フィールドの長さを(17のような)正当な値に制限できない場合は、このバグを模倣するためのラッパーが必要です。 – hirschhornsalz
これは非常に興味深いことですが、正確なバグを覚えていますか?これは私が必要とするもので、Linux版をそのバグがあってもWindowsのように動作させるためです。 – queen3
実際には.20の代わりに.17を設定しました。そして、linux/windowsは完全に互換性があります。あなたがあなたのコメントを私が喜んでそれを受け入れる答えを変更する場合。しかし、あなたが正確なバグのリンクを見つけることができれば、それはさらに役に立つでしょう。 – queen3