【问题标题】:my output does not show more than 6 decimal place after converting fractional decimal to binary. I need 12 decimal place将小数转换为二进制后,我的输出显示的小数位数不超过 6 位。我需要小数点后 12 位
【发布时间】:2019-03-10 15:40:07
【问题描述】:
int main(){

    long double fraDecimal,fraBinary,bFractional = 0.0,dFractional,fraFactor=0.1;
    long int dIntegral,bIntegral=0;
    long int intFactor=1,remainder,temp,i;

    printf("Enter any fractional decimal number: ");
    scanf("%Lf",&fraDecimal);

    dIntegral = fraDecimal;
    dFractional =  fraDecimal - dIntegral;

    while(dIntegral!=0){
         remainder=dIntegral%2;
         bIntegral=bIntegral+remainder*intFactor;
         dIntegral=dIntegral/2;
         intFactor=intFactor*10;
    }

   for(i=1;i<=12;i++){

       dFractional = dFractional * 2;
       temp =  dFractional;

       bFractional = bFractional + fraFactor* temp;
       if(temp ==1)
             dFractional = dFractional - temp;

       fraFactor=fraFactor/10;
   }

   fraBinary =  bIntegral +  bFractional;
   printf("Equivalent binary value: %Lf",fraBinary);

   return 0;
}

【问题讨论】:

  • 推荐这个here
  • 您需要将要打印的小数点宽度提及为%.[width]f example:%.4f-> 这将打印4 个小数点。

标签: c binary decimal-point


【解决方案1】:

而不是这个:

printf("Equivalent binary value: %Lf",fraBinary);

试试这个:

printf("Equivalent binary value: %.12Lf", fraBinary);

另请注意,它并不总是正确显示最后一个数字。至少在我的机器上,long double 是 8 个字节。这似乎将long double 的精度推到了极限。果然,this 声明

53 位有效数字精度提供从 15 到 17 有效数字 小数位精度

【讨论】:

  • 程序没有正确显示最后一个数字的输入是什么,您观察到的输出是什么,您期望正确的输出是什么?
  • @EricPostpischil 尝试输入44.44,得到101100.011100001007,预期101100.011100001010。我想解决这个问题需要 128 位浮点数,除非有更复杂的解决方法。
  • 谢谢,现在我发现问题是他们在二进制浮点格式中以“十进制”编号方式累积“二进制”数字,而且他们把它推得太远了。只在字符串中累积字符会更简单。
  • 忘了提,我已经尝试过 %.12Lf 但是当我这样做时,它给了我 12 位小数,但它不计算任何东西。例如,如果我输入 4.404,则任何输入的输出都变为 0.000000000000。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2016-08-15
  • 2022-12-05
相关资源
最近更新 更多