c语言两个浮点数相乘,两个浮点变量相乘结果为什么不精确

本文探讨了为什么在C语言中,两个浮点数相乘的结果可能不精确,这源于浮点数在计算机内存中的存储方式。文章通过分析浮点数的存储结构,展示了计算误差的来源,并提出了解决方案,包括使用Decimal类型进行精确计算,以及针对特定运算场景的优化策略。此外,还讨论了不同编程语言中处理浮点数精度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

浮点数精确运算的分析和解决办法1。01+2。01=3。022。01*2。01=40401不知你注意没有,这个很寻常的等式,你如果将它放在C++中,Java中,Basic中,它居然是不成立的。计算机在开玩笑吗?噢,对了,隐约记得这好象是浮点数的问题,似乎很多很多年前,老师说过。

还有某位姓林的先生在某本书里提过=0的判断。嗯,如果你不遇到此问题,那你完全可以把它抛到火星上去,可惜,偶不好彩,这样的问题,被俺遇到了。唉!why?how?没办法,硬着头皮,从头开始。一:为何不成立?Why?这得从浮点数的在计算机内的存储开始说起,我这里闲话少说。

我们只谈双精度double数(至于float,基本上是五十步和一百步的区别)。双精度数在计算机内的表示方式是:(三部分组成)符号(正或负)阶码(2的N次幂)尾数(大于等于1小于2的数)比如:-(符号)1。01(尾数)*2~1(N=1)=-2。

02具体到计算机的存储单元:双精度数共占8字节(64bit)符号位(占1个bit)阶码(11个bit)尾数(52个bit)解释一下:符号位:0表示正1表示负阶码:是一个偏移量,1023的偏移量,它的1023相当于0,小于1023时为负,大于1023时为正,如:10000000001表示指数为1025-1023=2,表示真值为2^2。

好了,知道了原理,我们开始分析上述等式为何为不等。(相应数的存储值,可以简单用C语言的指针方式取出)1。01表示为:00111111111100000010100011110101110000101000111101011100001010012。

01表示为;01000000000000000001010001111010111000010100011110101110000101003。02表示为:01000000000010000010100011110101110000101000111101011100001010012。

01+1。01在编程语言中的计算结果表示为:010000000000100000101000111101011100001010001111010111000010100

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值