1
#include <stdio.h>
#include <wchar.h> 
int main()
{
    double f = 1717.1800000000001;
    wprintf(L"double      %.20G\n", f);
    return 0;
}

出力(および以下で予想される):

double      1717.1800000000000637
double      1717.1800000000001

これはUbuntu11.10x64にあります(ただし、32ビット用にコンパイルする場合も同様です)。

私が解決しようとしている問題は、Windowsではコードとまったく同じように数値が出力されることです。移植性の問題のために、Windowsと同じように機能するように低レベルの書式設定(swprintf)を作成する必要があります。

4

4 に答える 4

2

1717.1800000000001はdoubleとして正確に表現できるわけではないため、fではそれに近い値しか取得できません。fに格納されている値は、正確に1717.180000000000063664629124104976654052734375です。

問題は、20が要求されたにもかかわらず、Windowsが有効数字17桁しか出力しないことです(これは既知のバグです。バグデータベースのどこかにあります)。

フィールドの長さを(のように)正常な値に制限できない場合は、 "%.17G"このバグを模倣するラッパーが必要です。

于 2012-02-29T09:52:07.923 に答える
1

wprintf関数は、gccではなく標準Cライブラリによって実装されます。

数値1717.1800000000001は浮動小数点の後に13桁あります。ただし、64ビットのバイナリ浮動小数点形式では正確に表現されていません。

フォーマット"%.20G"では、の桁数である有効数字20桁を出力する必要があります1717.1800000000000637。したがって、この出力は期待どおりです。Windows標準Cライブラリは、形式を異なる方法で処理するか、誤った丸めを行います。

一方、"%f"フォーマットを使用して、浮動小数点の後に特定の桁数を要求できます。たとえば"%.13f"、出力を浮動小数点の後に正確に13桁に丸めて、期待どおりに出力1717.1800000000001します。

于 2012-02-29T09:37:31.380 に答える
0

さて、あなたの期待される出力はあなたのフォーマット文字列と矛盾します。「%.20G」は、有効数字20桁が必要であることを意味し、それが得られます。期待される出力のように有効数字17桁が必要な場合は、「%。17G」を使用します。

于 2012-02-29T09:37:46.917 に答える
0
double f = 1717.1800000000001;

このコード行は正確に実行できません。定数の精度は10進数で17桁、doubleの精度は15.9です。

于 2012-02-29T09:39:55.683 に答える