Hazekiah 2015-08-29 14:32 采纳率: 50%
浏览 2651
已采纳

初学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是不是真有这么多有效数字
结果:
图片说明

这是怎么回事啊……我大概知道为什么会有这种情况,就是计算机把十进制转二进制存储再转十进制的过程出了问题……可是明明是机器告诉我有至少六位有效数字,那我输个六位有效数字的数不应该会出错的吧?

不知道哪位朋友能给我解答一下……是程序写错了吗?还是说有效数字的问题我理解错了?怎么样能让数值准确的输出呢?按照这种情况,岂不是大部分的运算的都是不准确的?

  • 写回答

5条回答 默认 最新

  • 另一花生 2015-08-29 16:10
    关注

    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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配