0

浮動小数点はすべての数値を正確に表すことができないため、何らかのエラーが発生することはわかっています。

しかし、最近問題が発生し、説明が正しくありません。

変換が出力にどのように影響したかを順を追って説明してください。

小数点以下を切り捨てると、どのように間違った答えが得られましたか?

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

int main()
{
   int x;
   int y = 0;
   int n = 0;

   printf("Enter The Number You Want To Octal Equivalent Of : ");

   scanf("%d",&x);

   while(x>0)
   {
      y = y + (x%8)*pow(10,n);

      printf("%d\n" , y);

      x = x/8 ;
      n = n + 1;
   }

   printf("Octal Equivalent is : %d" , y);
   return 0;
}

入力すると、 の 8 進数に相当するものが見つかります1701。それは答えを与える3244

私が知りたいのは、プログラムがどのように機能するかです。
プログラムはどのように印刷3244されていませんか3245

しかし、答えは3245です。

x%8正しく動作して いることを確認しました。

yデータ型を floatに変更すると、動作します。なんでそうなの?

変換が出力にどのように影響したかを順を追って説明してください。
小数点以下を切り捨てると、どのように間違った答えが得られましたか?

4

2 に答える 2

3

浮動小数点型から整数型に変換する場合、マシンは丸めではなく小数点以下を切り捨てます。

于 2015-10-25T12:14:11.630 に答える
0
Enter The Number You Want To Octal Equivalent Of : 1701
5
45
245
3245

これを試して、役立つかどうかを確認してください(数学ライブラリにリンクする必要はありません)

#include<stdio.h>
#include<stdlib.h>

int main()
{
int x;
int y = 0;
int n = 1;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);

while(x>0)
{
    y = y + ((x%8)*n);
    printf("%d\n" , y);

    x = x/8 ;
    n = n * 10;
    }


   printf("Octal Equivalent is : %d" , y);

   return 0;




    }

そして、私はあなたがこれを行うことができることを知っていると思いますか?

#include<stdio.h>
#include<stdlib.h>

int main()
{
int x;
int y = 0;
int n = 1;
printf("Enter The Number You Want To Octal Equivalent Of : ");
scanf("%d",&x);

while(x>0)
{
    y = y + ((x&7)*n);
    printf("%d\n" , y);

    x = x>>3 ;
    n = n * 10;
    }


   printf("Octal Equivalent is : %d" , y);

   return 0;




    }

またはASCIIアプローチを取る

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int x;
    int y = 0;
    int n = 0;
    char output[16];

    printf("Enter The Number You Want To Octal Equivalent Of : ");
    scanf("%d",&x);

    while(x)
    {
        output[n++]=(x&7)+0x30;
        x = x>>3 ;
    }
    output[n]=0x30;
    printf("Octal Equivalent is : ");
    while(n>=0)
    {
        printf("%c",output[n--]);
    }
    printf("\n");

    return 0;
}

または他の多くのソリューション...

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int x;
    int y = 0;
    int n = 0;

    printf("Enter The Number You Want To Octal Equivalent Of : ");
    scanf("%d",&x);

    while(x)
    {
        y |= (x&7)<<n;
        n+=4;
        x>>=3;
    }
    printf("Octal Equivalent is : %X\n",y);
    return 0;
}

編集

1701 = 0x6A5 = 0b011010100101

したがって、2 進数を 4 でグループ化すると、16 進数の値が表示されます (右から開始)。

0110 1010 0101 = 0x6A5

3 つのグループに分割すると、8 進数が表示されます。

011 010 100 101 = 03245

そして、私が示した最後の解決策がどのように機能するかを見ることができます。これらのそれぞれにゼロを付けてください

011 010 100 101

0011 0010 0100 0101

そして0x3245、ベース10で行っていたのとまったく同じですが、代わりにベース16を使用し、シフトとマスクを使用する最適化を利用しています。

編集2

この 1 行のコードでどれだけのことが行われているのかを理解する (x と y が int であると仮定)

y = y + (x%8)*pow(10,n);

最初の操作順序。コンパイラは歓迎されており、最初にモジュロを実行する必要がありintます。操作の次の順序、括弧はすべての疑いを取り除きます。次は乗算ですが、オペランドの 1 つが a であるdouble (pow)ため、モジュロの結果を に昇格する必要がありdoubleます。二重乗算が発生します。intこれで、一方が他方であることが追加されましたdouble。したがって、この y は に昇格しdoubledouble加算が行われ、次に がdoubleたまたまintに格納されyます。n go1, 10, 100, 1000などを作成する私の最初のより単純な例を見ると、プロモーションは常にintありません。doubleint

を作成yする場合float、加算は であるfloat + doubleため、倍精度に昇格する必要があります。以前のように二重加算が行われますがy、等号の左側へのストレージが a として、 to変換が可能になり、丸めます。そのため、ループを通過するたびに、わずかな部分が. ここでの問題、少なくともあなたの例では、浮動小数点形式が処理できない分数は見られません。モジュロは として実行されることになっており、分数はありません。に変更すると、必ず問題が発生します。floatdoublefloatyintxfloat

于 2015-10-25T12:27:38.217 に答える