c语言里字符的1加1等于多少,100个0.1相加等于多少

100个0.1相加等于多少?

一、前言

在大家的认知过程中可能会认为计算机是不会出现计算错误的,但是实际上,依然存在程序运行后无法得到正确数值的情况。其中,最经典的就是小数运算。

二、引入

在我们的世界里面,100个0.1相加就是10,这个是没有疑问的。但是让我们来看看计算机世界的计算结果:

首先是一段计算代码:

#include

int main(void) {floatsum;inti;

sum= 0;for (i=0 ;i<100;i++) {

sum+= 0.1;

}

printf("%f\n",sum);

}

运行结果如下:

10.000002

计算机通过编译、链接、运行得到的结果是10.000002。程序没有错。现在让我们来看一下具体原因吧。

三、计算机计算结果不正确的原因

简单来说,就是无法表示正确的数值,导致计算出来的结果成了近似值。下面进一步剖析一下。

首先,我们来看一下在计算机世界里面如何用二进制数表示小数:

例如把1011.0011这个小数点的二进制数转成十进制数。(只需将各数位数值和位权相乘,然后将相乘的结果相加)

也就是:1*2^3+0*2^2+1*2^1+1*2^0+0*2^(-1)+0*2^(-2)+1*2^(-3)+1*2^(-4) = 11.1875。

了解了二进制表示的小数转十进制的方法后,计算出错的原因也就容易理解了。用小数点后4位用二进制表示时的数值范围为:0.0000~0.1111。因此,对应的十进制结果如下:

223628361.png

从上面的对照表可以看出,0的下一位就是0.625。因此0~0.0625之间的数值计算机无法用小数点后4位数的二进制数表示。因此可以看出0.1无法用4位二进制数表示。就算增加二进制的位数,也无法得到2^(-x) =0.1 这个结果。

实际上,十进制0.1转成二进制后,就变成了0.0001100110011……(1100循环)这样的循环小数。就像1/3是一个道理。因此100各0.1相加不等于10,而是等于近似值。

---------------------------------------------以上就能够回答标题的原因了---------------------------------------------

四、What is 浮点数?

其实像刚才那样的1011.0011这种表现形式完全是纸面上的二进制数表现形式,在计算机内部是无法使用的(计算机内部只是0101001……没有"."这个概念)。实际上,编程语言提供了双精度浮点数(double)和单精度浮点数(float)。双精度浮点数类型用64位、单精度浮点数用32位来表示全体小数。

浮点数:就是用符号、尾数、基数和指数表示的小数。

223628362.png

其中:±表示符号,m表示尾数,n表示基数,e表示指数。实际数据中不考虑基数。因此:

223628363.png

其中:

1、符号部分:1表示负、0表示正或者0。

2、尾数部分用的是:将小数点前面的值固定位1的正则表达式。

3、指数部分:用的是EXCESS系统表现。

先看看尾数部分。对于十进制的0.75。我们有如下的表示方法:

①、0.75 = 0.75*10^0

②、0.75 = 75*10^(-2)

③、0.75 = 0.075*10^1

十进制的表示正则为:小数点前面是0,小数点后面第一位不是0的规则表示。而对于二进制也是一样的道理,使用的是:将小数点前面的值固定为1的正则。也就是将二进制数表示的小数左移或右移(逻辑移位)数次后,整数部分的第一位变成1,第二位之后变成0.而且第1位的1在实际数据中不保存。

例如1011.0011:

移位变成0001.0110011,确保小数点后23位:0001.01100110000000000000000,仅保留小数点后面完成正则:01100110000000000000000。

再看看指数部分。EXCESS系统表现:将指数部分表示范围的中间值设置为0,使得负数不需要用符号来表示。例如当指数部分是8为单精度浮点时,最大值11111111=225的1/2即01111111=127表示0。双精度类似。

因此对于单精度浮点数的表现,其表示范围就是:00000000~11111111也就是-127~128。看下面例子:

#include #include

int main(int argc, char *argv[]) {floatdata;

unsignedlongbuff;inti;char n[34];//将0.75以单精度浮点数形式存储在data中

data = (float)0.75;

memcpy(&buff,&data,4);for (i=33;i>=0;i--) {if(i==1 || i==10) {

n[i]= '-';

}else{if(buff%2==1) {

n[i]= '1';

}else{

n[i]='0';

}

buff/=2;

}

}

n[33] = '\0';

printf("%s\n",n);

}

运行结果:

0-01111110-10000000000000000000000

其中01111110是126,EXCESS表示为-1。

小数点前面的第一位是1。因此尾数就是:1.10000000000000000000000也就是1.5。

也就是+1.5*2^(-1) = 0.75。

五、如何避免小数计算出错导致的问题

可以将小数替换成整数来计算。然后在缩小相应的倍数。

大数法(c语言实现) 或许我会大数法了嘻嘻嘻嘻嘻 1.首先就是把大数储存在数组或字符串中,一个数组或者字符串元素存放一位数。 例如 :大数a: 5695926564135 大数a 5 6 9 5 9 2 6 5 6 4 1 3 5 下标 0 1 2 3 4 5 6 7 8 9 10 11 12 ... 阅读详情

相关推荐

一起刷C语言菜鸟教程100题(15-26含解析)

五一过的好快,五天假期说没就没,因为一些事情耽搁到现在,不过还是要继续学习的,之后就照常更新,先说一下,这个100题是菜鸟教程面的,但是有一些题,我入了自己的理解,甚至对有一些题进行了改编,目的是让大家更顺手一点,链接放在下面,需要的小伙伴可以点进去看看,话不多说,开始刷题。求第一天共摘了多少。解题思路:这类画图题一般都是找规律的题目,我们可以把菱形拆解成上三角和下三角,我们发现上三角形每一行 * 前面的空格都是逐渐递减,而 * 是逐渐递增的,下三角形的空格逐渐递增, * 逐渐递减,就可以完成代码了。

2302_81032013的博客 2262

帮我编写个1+1的C语言程序

好的,以下是一个求 1+1 的 C 语言程序: #include <stdio.h> int main() { int result; result = 1 + 1; printf("1 + 1 = %d\n", result); return 0; } 请注意,上面的代码需要使用 C 编译器编译和运行,否则不能正常工作。 ...

weixin_42610671的博客 2431

Kali下RTL8812AU网卡5G抓包精准适配指南

WiFi监听模式是无线安全测试的基础能力,其核心在于网卡驱动对802.11a/n/ac协议栈的完整支持。RTL8812AU系列USB无线网卡因成本低、兼容性广被广泛用于渗透测试,但其芯片版本碎片化(如VA/VC/ACM)与Linux内核演进(6.1~6.5)存在严重适配断层,导致5GHz频段Beacon帧捕获失败、信道切换异常、注入功能残缺等典型问题。技术价值在于突破‘即插即用’幻觉,建立从USB设备ID识别、固件版本校验到射频寄存器级补丁的全链路可控流程。典型应用场景包括CTF无线赛题实战、红蓝对抗中的W

weixin_33783283的博客 689

为什么1000.1相加等于10

文章目录1000.1相加等于多少?计算机的小数表达欠缺表达的二进制小数无法正确计算的原因解决办法结语 1000.1相加等于多少? float sum=0 for (int i=0;i<100;i++){ sum+=0.1 } print(sum) 这段代码的运行结果可能大家都会理所当然的认为是10。可严谨的计算机却出乎意料的给出了错误的答案。 9.99999999999998 很意外吧,让我们来一起探究其原因。

qq_24264445的博客 1017

11在什么情况下等于3

有关Integer类型值大小比较的问题

IT_慢慢 6983

简谈'1'和"1",字符相加问题

首先我们要明白: ‘1’ 是字符型; "1"是字符串型; 其次明确字符型,也就是char型实际上是整形(integer)中最小的类型,在内存中占8bit(位),也就是一个byte(字节),故也被称为int8;这也拓展一下,c中浮点型与整形的相互转换在c中可以隐式的,也就是char(int)+float(double)成立; #include<iostream> using names...

qq_43702096的博客 2249

1000.1相加等于多少

原文地址:https://community.esm-cn.com/t/100-0-1/2147/3 一、前言 在大家的认知过程中可能会认为计算机是不会出现计算错误的,但是实际上,依然存在程序运行后无法得到正确数值的情况。其中,最经典的就是小数运算。(做金融的一定要小心!!!) 二、引入 在我们的世界面,1000.1相加就是10,这个

yilonglucky 3080

C语言大数相加实现方法分析

使用C语言内置的int,在32位系统下最大只能表示2^31-1,也就是2147483647,想要表示更大的数可以使用字符串。下面是楼主实现字符串数字相加的分析过程:1.首先来个简单的,单个数字字符相加求和inline int addchar(char c1,char c2,char &amp;s){ int t=c1+c2; //0-9的ascii码是48-57 if(t&lt;106){/...

rtduq的博客 2万+

C语言大数相加实现

主要思路: 由于大数不可存入int数组中,所以将数字转为字符输入char数组中,将两个数组数字从个位开始,模拟正常数字法,需要进位1时设置进位标志,两数相加大于10时进位,见具体代码。 #include <string.h> #include <stdio.h> int main () { char a[100], b[100], c[101]; //创建用于接收...

qq_45824823的博客 2415

C语言:二进制相加输出二进制

二进制相加输出二进制 给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 10。 示例 1: 输入: a = “11”, b = “1” 输出: “100” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” #include<stdio.h> #include<string.h> main() {...

ABlackDay的博客 4093

C语言精选100道编程题(附有图解和源码)

本文精选了100道C语言编程题,涵盖基础算法和常见问题。内容包括:打印1-100奇数、九九乘法表、判断素数、三角形判断、最大公约数/最小公倍数计算、分数求和以及数组最值差计算。每道题目均配有详细图解、解题思路和完整源码实现,适合C语言初学者练习基础语法和算法思维。题目难度由浅入深,从简单的循环结构到数学运算和逻辑判断,帮助读者逐步提升编程能力。部分题目提供多种解法(如辗转相除法求公约数),并附有优化方案说明。

铭哥不写bug的博客 4526

C语言1000后面有多少0,c语言题目计算1000!的末尾有多少个零

一道用C语言编程计算积分的题目,求大神解答!可追分.你好,最近时间不多,所以只能提示你一下,这个题目的重点不是要算积分,而是解非线性的方程.但是其中可能涉及到数值积分或者微分的问题.由于非线性的方程解的结构因题目而异所以只有数值方法.区间二分法是其中最C语言编程问题:题目计算圆的面积.你这个怎么看都是错的第一,主函数是这样定义的吗第二,这乘法运算需要把float型转化为double型最后,没有返...

weixin_34099891的博客 1955

C语言——大数相加思想

C语言——大数相加思想 在C语言中,如果我们要计算1+1,则可以直接进行1+1计算,这是因为1在int能表示的大小,如果我们要计算的数超过了int类型所能表示的最大值,我们该怎么办? int能表示的最大数字是2147483647,如果我们要计算2147483648+2147483649的话,直接计算会有什么结果? 我们来运行一下试试: #include<stdio.h> int main() { int a = 2147483648; int b = 2147483649; printf

m0_62386635的博客 580

C语言大数相加

当要执行相加的两个数超出C语言所能表示的范围时,就不能用正常的法运算来执行相加操作,这时候可以用两个字符数组接收要相加的两个大数, 然后从两个大数的地位进行按位相加,并设置一个进位标志,如果标志为1表示有进位,否则没有进位。 要注意的是字符数组的地位为数字的高位,所以要从数组下标大的地方开始相加。 #include #include int main(){ //a,b数组

x_i_y_u_e的专栏 2023

大数相加

问题描述:实现A+B=C   其中A、B位数超过100位 算法思想:大数使用字符串存储,每一个单元存储操作数的每一位,之后执行位相加。 基本思路:字符串反转、字符变数字、位运算、反序输出 C语言代码: #include #include #define Max 101 void print(char sum[]); void bigNumAdd(char a[],char b[],char

思考,思考,再思考~ 1万+

两个超大数相加c语言,实现两个超大整数相加 -- C语言

思路从后向前处理,逐个相加,记录进位Carrer;注意到头的结束条件是 str -1,因为字符串的头本身也要处理,结束条件是头前面的一个指针地址;最后如果有更长的一个数字,将其剩下的部分Carrer,补充到前面。最前面一个处理,C可能为1,我们一般多留一位,如果C为0,那么整个字符串前移一位,结尾提前一位写入'\0'代码实现int addBigInt(char * str1, char * s...

weixin_35848310的博客 633

实现两个超大整数相加 -- C语言

思路 从后向前处理,逐个相加,记录进位Carrer;注意到头的结束条件是 str -1,因为字符串的头本身也要处理,结束条件是头前面的一个指针地址;最后如果有更长的一个数字,将其剩下的部分Carrer,补充到前面。最前面一个处理,C可能为1,我们一般多留一位,如果C为0,那么整个字符串前移一位,结尾提前一位写入'\0' 代码实现 int addBigInt(char * str1, c...

六六哥的博客 4265

C语言利用ASCII码表统计字符串每个字符出现的次数

今天在图书馆老胡突然给我出题 在C语言面写个能够统计并打印字符串中字符出现次数 心想这不是常规操作吗?“定义一个char数组,输入,通过一个for循环嵌套两个for循环,比较,相同的值数组赋值=’*’,然后判断当数组值不等于0的时候和原数组进行比较再打印输出” 不用ascII码 #include<stdio.h> #include<string.h> #define ma...

编程知识分享,主打前端 4万+

两个大数相加输出结果(C语言)

    首先这个算法的要求是:两个一百位以内的大数相加输出结果,两个数长短不确定。     那么什么样的数字是大数呢? 所谓的大数其实就是一个无限大的数字,他的位数没有限制;int,long型都装不下的数字,所以在这我们自然就考虑到用字符串或是字符数组的形式来存取数的每个数字,对两个大数的每个数字来进行法运算,结果大...

qq_39414417的博客 2044

从SD更新字库到FLASH,再用LCD显示

用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显...

weixin_30505751的博客 899

【大气湍流】LG光束光强相位大气湍流相位屏Matlab仿真.md

【大气湍流】LG光束光强相位大气湍流相位屏Matlab仿真.md

上一篇: c语言版计算坐标方位角,直线坐标计算程序
下一篇: c语言7段码静态显示 dula,静态显示
李胜民
博客等级 码龄8年 27粉丝 89原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值