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;
}

当我输入时,找到等效于1701. 它给出了答案3244

我想知道的是程序是如何工作的?
程序如何打印3244而不是3245

但答案是3245

我已经检查过它x%8是否正常工作。

当我将y数据类型更改为浮动时,它可以工作。为什么这样?

请逐步向我解释转换如何影响输出。
截断小数位如何给我错误的答案?

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

所以如果你把二进制数分成四组,你可以看到十六进制值(从右边开始)

0110 1010 0101 = 0x6A5

如果你把它分成三个一组,你会看到八进制

011 010 100 101 = 03245

你可以看到我展示的最后一个解决方案是如何工作的,在每个上面加上一个零

011 010 100 101

0011 0010 0100 0101

你得到0x3245了,正是你用 base 10 做的,但是用 base 16 代替,并利用了使用 shift 和 mask 的优化。

编辑 2

了解这一行代码中发生了多少事情(假设 x 和 y 是 int)

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

首先关闭操作顺序。欢迎编译器并且应该首先进行模运算,得到一个int. 下一个操作顺序,括号将消除所有疑问。接下来是乘法,但一个操作数是 a double (pow),因此必须将模的结果提升为double。并且发生了双重乘法。现在你已经添加了一侧是int另一侧double。所以这个 y 被提升到doubledouble添加发生然后doubletoint恰好存储在 中y。如果您查看我的第一个更简单的示例,将 n go1, 10, 100, 1000等视为一个,int那么就没有double促销它一直保持不变int

如果你做ya float,那么加法是 afloat + double所以y必须提升为双精度,双加法像以前一样发生,但现在存储到等号的左侧,作为 a float,你有一个doubletofloat转换,这允许四舍五入。因此,每次通过循环时,您都有机会让一小部分着陆y。这里的问题,至少在你的例子中,我没有看到浮点格式无法处理的任何分数。模应该作为一个完成int并且没有分数。如果您更改x为 a float,那么肯定会遇到问题。

于 2015-10-25T12:27:38.217 回答