4

必ずしも正であるとは限りませんが、通常は二重です。0.xxxx000 または X.xxxx00000 または XX.00000 または 0.xxx0xxx00000 のいずれかになり、最終的には最後の数字の右側がすべて 0 になります。桁数を追跡する必要があります。私はこれで困っています、何か助けてくれますか?これはCです。

4

3 に答える 3

6

double には 52 の仮数ビットと暗黙の「1」ビットがあるため、64 ビット整数への double ポインターをタイプパンすることができるはずです (生のビットを整数に変換する)、 &= this with (1<< 52)-1、および |= (1<<52) の結果。

その log10 は 10 進数の桁数になります。

とはいえ、私は「ジョンスカのソリューションを採用する」と言う傾向がほとんどあります。なぜなら、それは非常に巧妙に単純だからです (いずれにせよ、KISS であるためには +1 に値します)。

于 2011-03-28T13:22:46.700 に答える
5

sprintf を使用して文字列に変換し、数字に対して必要なカウント/テストを実行します

于 2011-03-28T13:15:31.677 に答える
2

double の表現は 10 進数ではなく、2 進数です (コンピューターの他のすべての数値と同様)。あなたが定義した問題は、ほとんど意味がありません。例を考えてみましょう: 数値 1.2 は 2 進数に変換されます - 1+1/5 = 1.(0011) 2 進数 [ピリオドで 0011]。52 ビットの精度 (倍精度) にカットすると、1.0011001100110011001100110011001100110011001100110011 バイナリが得られ、1+(1-1/2^52)/5 に等しくなります。この数値を 10 進数形式で正確に表すと、すべてゼロの前に 52 個の 10 進数が得られます。これは double の最大 10 進数精度である 16 桁よりもはるかに多くなります (17 から 52 までの表現のすべての桁は無意味です)。 .

とにかく、純粋に抽象的な問題がある場合(学校のように):

int f( double x )
{
  int n = 0;

  x = fabs(x);
  x -= floor(x);

  while( x != floor(x) )
  {
    x *= 2;
    ++n;
  }

  return n;
}

この関数は、すべてゼロの前の 2 進数の桁数を返します。これは、すべてゼロの前の 10 進数の桁数でもあります (戻り値 > 0 の場合、最後の 10 進数は常に 5 です)。

于 2011-03-28T14:18:28.503 に答える