2

http://www.exploringbinary.com/correct-decimal-to-floating-point-using-big-integers/を実装しようとしています

何度も読み返しましたが、とても快適です。最初のステップは、値が文字列形式であると仮定することです。私の実装では、値が double 形式であると想定しています。

float/double の小数部分を構成する桁数を取得することは可能ですか?

たとえば、値 3.24325 (ランダムに選択しただけなので、バイナリで正確に表現できないことを願っています)。上記のリンクのアルゴリズムを続行できるように、小数部分が 5 桁であることを知りたいです。

次のようなものを使用modfすると、一見正しい小数値のように見えますが、実際には丸められます (小数部分を 2 進数で正確に表すことができないと仮定します)。元の値から型キャストされた int を減算すると、同じ丸められた 10 進数になります。sprintf を使用して文字列に値を記録すると、同様の問題が発生すると思いますが (私は信じています)、それを確認するのに十分な時間がありませんでした。

上記のリンクのアルゴリズムのステップ 1 に対する解決策はありますか?

ありがとうございました。

4

2 に答える 2

0

以下は、問題に対する素朴なアプローチです。ほとんどの場合、これは機能しますが、浮動小数点整数表現が原因でエラーが発生する可能性があります。

#include <stdio.h>
#include <math.h>
    #define eps 0.000001
    int main(){

        double inp=3.12456789;

        int fdigits=0;
        while(fabs(round(inp)-inp)>eps){
            printf("dif %f\n",fabs(round(inp)-inp));
            inp=inp*10;
            fdigits++;

        }
        printf("%d",fdigits);
    return 0;
    }
于 2013-01-22T20:52:17.133 に答える
0

1 つのオプションは、 で使用sprintfすることstrchrです。以下に一例を示します。

int main() {
    double d = 3.24325;
    char str[20];
    sprintf(str, "%.10f", d); 
    puts(str); 
    int digits = strchr(str, '0') - strchr(str, '.') - 1;
    printf("%d", digits);
}

出力

3.2432500000
5

上記のコードでは、 and (最初の末尾)strchrの位置を検索し、それに基づいて数字を計算します。デモンストレーションを簡単にするために、いくつかの余分な を に追加しました。代わりに、 が文字列の末尾にポインターを返すかどうかを比較することにより、末尾に がない場合の計算を調整できます。.00%.10f0strchr

于 2013-01-22T20:19:07.263 に答える