开发者社区> 问答> 正文

初学C……求助float有效数字的问题

关于浮点数有效数字我有很多疑惑,我发现我读入一个浮点数后再输出,两个数字是不相等的。开始我以为是我输入的数字超过了float有效数字位数的原因,但是下面这个程序证明不是这个原因:

#include <stdio.h>
#include <float.h>
int main(void)
{float test;
char data[7];

printf("Float has at least %d effective numbers\n", FLT_DIG);
printf("Then i'm gonna check it!\n");
printf("test data:_______\b\b\b\b\b\b\b");
scanf("%f",&test);

printf("please input again to confirm it:_______\b\b\b\b\b\b\b");
scanf("%s",&data);

printf("So %f is supposed to be %s", test, data);

return 0;
}

就是先查了一下我的机子规定float至少几个有效数字,然后输入一个数字,输两边,一次存成float,一次存成字符串,最后检验float是不是真有这么多有效数字
结果:
screenshot

展开
收起
a123456678 2016-03-23 14:14:46 2263 0
1 条回答
写回答
取消 提交回答
  • float数据 机器内是2进制数,
    1位符号位
    8位指数位
    23位“尾数”位
    共32 位 2进制数。
    平时讲 有效数字 是6~7位 ,指10进制。

    通常程序输入的数是10进制,进入机器后要化成2进制,计算完又转十进制输出。
    10进制到2进制,2进制到10进制 转换,有的数化不净,有的数化得净。
    如同10进制分数化10进制小数,有的化得净(例如 4分之1,变0.25),有的化不净(例如 3分之1,变0.33333....)。

    10进制到2进制,2进制到10进制 转换,化得净的效数字7位,化不净的效数字6位,因为最后一位有舍入误差。
    例如:
    float x,y;
    x=0.51; // 化不净
    y=0.5; // 化得净
    printf("x=%.8f y=%.8",x,y); // 输出 0.50999999 0.50000000

    2019-07-17 19:10:57
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载