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 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算