3

私はプログラミング初心者です。小数点 X.YZ を含む数値を XYZ に変換する単純な関数が必要でした。十分な 10 倍を掛けて、doubleからintへの変換を使用して行いました。


  int main()
  {
    std::cout << "Number: " << std::endl;
    double a;
    // the uninitialized b was pointed out, its not the issue
    long b = 0;

    std::cin >> a;

       while(b!=a)
             {
              a*=10;
              b=a;
             }

    std::cout << a << std::endl;
    return 0;
  }

これは 90% の確率で機能します。132.54 のような一部の数値では、プログラムは無限に長く実行されます。132.547(132.54よりも多くのメモリを使用する必要があります)を処理します。

だから私の質問は: long int のメモリ範囲の数値に対して 100% 機能しないのはなぜですか? なぜ 132.54 と同様の数値なのですか?

Codeblocks と GNU GCC コンパイラを使用しています。

4

5 に答える 5

2

あなたの問題は、決して初期化bしないため、未定義の動作になることです。

これを行う必要があります:

 long b = 0;

これで、b を他のものと比較して、適切な動作を得ることができます。

またfloatintegral型との比較は、適切なイプシロン値との比較のように行う必要があります。

 while(fabs(an_int - a_float) < eps) 
于 2012-09-25T11:34:35.493 に答える
1

double として読み取る代わりに、文字列として読み取って解析します。そうすれば、浮動小数点精度の問題に遭遇することはありません。

于 2012-09-25T12:02:14.210 に答える
0
long b;

ここで を定義します b。この時点から、変数にはガベージ値が含まれます。値は完全にランダムにすることができます。基本的には、割り当てられたときにたまたまメモリにあったものです。その後、この変数を条件で使用しています。

 while(b!=a)

これは未定義の動作につながります。これは基本的に、アプリが (運が良ければ) 動作しているように見える機会を含め、 にあるガベージ値に基づいて、何かが起こる可能性があることを意味しますb

bこれを回避するには、を何らかの値 ( など) で初期化する必要がありますlong b = 0

于 2012-09-25T11:39:10.420 に答える