c语言 浮点数误差,[扫盲]为什么浮点数运算会有误差

在开始阅读本文之前,请猜测一下下面程序的输出结果:

float a=0.0f;

for(int i=0;i<10;i++){

a+=0.1;

}

cout<

true? You're too young, too simple, sometimes naive.

虽然乍看上去很不可思议,但是0.1叠加10遍的确是和1.0不等的。这种诡异的情况是由于浮点数的计算误差引起的。

既然是扫盲贴,我就稍微罗嗦一点,先从浮点数的格式讲起吧。

在IEEE标准中,浮点数是由符号位(1 bit),指数位(8 bits of float and 11 bits of double)以及精度位(23 bits of float and 52bits of double)组成的。

不放假设符号位是sym,指数位是exp,精度位是pre,那么一个浮点数的值就等于(sym==1? - : +) 1.pre * 2^(exp-2^k)。其中,k=指数位的位数-1,即是说,k=7 of float, k=10 of double。

举个例子1 10000001 11010010001000000000000表示一个float number,它的值是-1.11010010001000000000000*2^(129-2^7) = -1.11010010001000000000000*2。

但是,2进制的浮点数表示有一个很大的问题——它并不可以精确表示所有实数。说得更准确一点,只有可以写成2^a+2^b+2^c+...这种形式并且精度不能太多的实数才可以用浮点数来精确表示。而大多数实数仅仅保存了一个四舍五入后的近似值而已。譬如,0.1在单精度浮点数中实际值为0.100000001490116119384765625。

正是这种非精确的表示形式,造成了浮点数运算的误差。不管加减乘除,只要涉及到了浮点数,你都得心里清楚:结果不是精确值,只是近似罢了。所以,在浮点数的运算中,请尽量避免用==比较结果,可以用 a+b

顺带提一下,0和无穷大在浮点数中是可以精确表示的,IEEE规定,除了符号位外全0表示0,除符号位全1表示正负无穷。

好吧,把话题扯回来。由于浮点数运算有误差,浮点数的四则运算不具备结合律和分配率。

看一个wiki上的例子:

a = 1234.567, b = 45.67834, c = 0.0004

(a + b) + c:

1234.567   (a)

+   45.67834 (b)

____________

1280.24534   rounds to   1280.245

1280.245  (a + b)

+   0.0004 (c)

____________

1280.2454   rounds to   1280.245 

a + (b + c):

45.67834 (b)

+  0.0004  (c)

____________

45.67874

45.67874 (b + c)

+ 1234.567   (a)

____________

1280.24574   rounds to   1280.246

另一个例子:

1234.567 × 3.333333 = 4115.223

1.234567 × 3.333333 = 4.115223

4115.223 + 4.115223 = 4119.338

but

1234.567 + 1.234567 = 1235.802

1235.802 × 3.333333 = 4119.340

总结:懒得写。非要说点什么的话,谢谢大家捧场^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

h3c防火墙u200配置命令_h3c 防火墙清除配置

reset saved-configuration 重置配置文件。The saved configuration file will be erased. Are you sure? [Y/N]:YConfiguration file in cfa0 is being cleared. Please wait ...Configuration file is cleared.reboot 重新防火墙Start to check configuration with next sta…

c语言库快速幂函数,C语言 - 快速幂 - 迭代法+递归法 - 详细讲解

快速幂的作用&#xff1a;解决 求 a ^ n 的问题 (n可以大于1e18)&#xff0c; 如果用for循环的话&#xff0c;毫无疑问直接炸掉 …… 所以也就用了算法复杂度在 o(log n)的快速幂算法来解决此类问题。快速幂递归法(基于二分思想)&#xff1a;那么既然要用到二分法那么怎么二分&…

python virtualenv_python开发之virtualenv与virtualenvwrapper讲解

在使用 Python 开发的过程中&#xff0c;工程一多&#xff0c;难免会碰到不同的工程依赖不同版本的库的问题&#xff1b;亦或者是在开发过程中不想让物理环境里充斥各种各样的库&#xff0c;引发未来的依赖灾难。此时&#xff0c;我们需要对于不同的工程使用不同的虚拟环境来保…

android 自定义 popupwindow,Android自定义弹出窗口PopupWindow使用技巧

PopupWindow是Android上自定义弹出窗口&#xff0c;使用起来很方便。PopupWindow的构造函数为public PopupWindow(View contentView, int width, int height, boolean focusable)contentView为要显示的view&#xff0c;width和height为宽和高&#xff0c;值为像素值&#xff0c…

python花萼长度表_python描述性统计实践

1、加载相关库和数据集使用的库主要有&#xff1a;pandas、numpy、sklearn、matplotlib、seaborn使用的数据集&#xff1a;sklearn库中的鸢尾花数据集import pandas as pdimport numpy as npfrom sklearn.datasets import load_irisimport matplotlib.pyplot as pltimport seab…

android lottie字体json,Android 动画深入Lottie

image.png如果现在有需求,让这个小人做出拳击动作你应该如何做? 传统方法会写一大堆的路径值做路径动画&#xff0c;不好调试代码臃肿并且麻烦&#xff0c;那么有简单方法吗 有&#xff01; SVG 和 Lottie 可以胜任 SVG编辑麻烦美工不太会弄&#xff0c;那么我们用Lottie 下面…

android 搜索工具栏,Android记事本在菜单栏添加搜索按钮方法

效果图这个app结构和我之前将记事本开发的博客基本一致&#xff0c;我这里直接讲一下怎样添加使用的开发软件为android studio首先在res目录下新建文件夹menu&#xff0c;添加目录布局文件main_menu之后在main_menu中添加如下代码xmlns:app"http://schemas.android.com/ap…

5分钟k线数据 存储_成功率极高的“分时K线战法”:15分钟K线战法+30分钟K线战法...

实战看盘最常用的就是日、周、月等K线图。这些图形对于我们分析个股走势的确帮助很大&#xff0c;然而遇到调整时&#xff0c;就显示了其宏观有余、微观不足的缺点。但假如我们用分时K线图进行微观的观察与分析&#xff0c;就可以找到一些个股在调整中的规律&#xff0c;比如15…

python redis模块常用_python-Redis模块常用的方法汇总

Redes模块常用的方法汇总一.创建建Redis对象1.直接使用import redisr redis.Redis(host127.0.0.1, port6379)2.连接池使用import redispool redis.ConnectionPool(host127.0.0.1, port6379)r redis.Redis(connection_poolpool)3.库的选择import redisr redis.Redis(db0) #第…

android camera 显示过程,Android Camera2 API显示已处理的预览图像

澄清问题后编辑;最初的答案在底部取决于您在哪里进行处理.如果您正在使用RenderScript,则可以将Surface从SurfaceView或TextureView连接到分配(使用setSurface),然后将处理后的输出写入该分配并使用Allocation.ioSend()将其发送出去. HDR Viewfinder demo使用这种方法.如果您正…

android布局的属性,android

第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:layout_centerVertical 垂直居中android:layout_centerInparent 相对于父元素完全居中android:layout_alignParentBottom 贴紧父元素的下边缘android:layout_alignParentLeft 贴紧父元素的左…

python旋转排序数组_LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组 python实现...

题目描述&#xff1a;python实现Search in Rotated Sorted Array 搜索旋转排序数组中文&#xff1a;假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如&#xff0c;数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。搜索一个给定的目标值&#xff0c;如果数组中…

nfc卡模式与标准模式_张家口市环卫进入首都标准“京环模式”

“路上看不见垃圾&#xff0c;垃圾箱更卫生了&#xff0c;路边公共设施齐全了。”喜欢晨练的王先生最近格外喜欢在河边便道上散步&#xff0c;切身感受城市环境面貌改善带来的获得感。而这背后&#xff0c;除了环卫工作者的付出&#xff0c;也见证了张家口市城乡环卫一体化项目…

pyqt 取鼠标处文字_爱剪辑:炫彩的动态标题文字特效,这招让视频片头LOGO更酷炫...

爱剪辑学习委员会提醒您&#xff1a;道路千万条&#xff0c;学习第一条。教程不学会&#xff0c;制作两行泪。今天教大家制作炫彩的动态标题文字特效&#xff0c;3步即可快速学会&#xff0c;让你立马不再流泪。爱剪辑官网下载&#xff1a;http://www.aijianji.com/爱剪辑LOGO效…

android studio 搭建环境,Android studio搭建xposed环境

一、环境准备xposed&#xff1a;https://repo.xposed.info/module/de.robv.android.xposed.installerxposed-api&#xff1a;https://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067二、环境搭建Android studio选择->Empty Actvity将api.ja…

强化学习原理与python实现原理pdf_纯Python实现!Facebook发布PyTorch分布式强化学习库...

图灵TOPIA来源&#xff1a;Facebook编译&#xff1a;刘静图灵联邦编辑部出品Facebook于近日发布了PyTorch中用于强化学习(RL)研究的平台&#xff1a;TorchBeast。TorchBeast实现了流行的IMPALA算法的一个版本&#xff0c;用于RL代理的快速、异步、并行训练。另外&#xff0c;To…

鸿蒙开发还可以用安卓,华为鸿蒙2.0可以替代安卓吗,华为鸿蒙2.0优势在哪

在华为开发者大会上&#xff0c;华为消费业务CEO 余承东&#xff0c;正式发布鸿蒙OS2.0&#xff0c;并宣布华为鸿蒙OS将全面启用全场景生态&#xff0c;并将于2020年12月发布手机版。余承东还表示&#xff0c;明年&#xff0c;华为的智能手机将全面升级&#xff0c;以支持鸿蒙操…

深入浅出强化学习_直播 | 深入浅出理解 A3C 强化学习

强化学习是一种比较传统的人工智能手段&#xff0c;在近年来随着深度学习的发展&#xff0c;强化学习和深度学习逐渐结合在了一起。这种结合使得很多原来无法想象的工作有了可能&#xff0c;最令我们瞩目的莫过于 AlphaGo 战胜李世石&#xff0c;以及 OpenAI 团队的机器人可以在…

鸿蒙os2.0公测机型,鸿蒙OS2.0第二期第三期公测机型陆续公布 麒麟980和麒麟820将登场...

继官方透露鸿蒙OS2.0将开始大规模推送之后&#xff0c;在第一批为华为Mate X2&#xff0c;Mate40系列等系列机型推送后&#xff0c;近期官方再次开启了鸿蒙系统(HarmonyOS 20开发者Beta)的第二期公测&#xff0c;在原有机型的基础上再次增加了nova系列的6款机型&#xff0c;根据…

python 天气雷达_python结合API实现即时天气信息

python结合API实现即时天气信息import urllib.requestimport urllib.parseimport json"""利用“最美天气”抓取即时天气情况http://www.zuimeitianqi.com/"""class ZuiMei():def __init__(self):self.url http://www.zuimeitianqi.com/zuimei/q…