专栏首页循迹漫聊虚幻引擎两个迭代器初始化容器出现浮点数舍入

两个迭代器初始化容器出现浮点数舍入

最近在整理笔记的时候发现了个奇怪的问题:

这段代码的输出为:

0.1 1.2 2.3 3.4 4.5 5.6 6.7 7.8 8.9 10 0 1 2 3 4 5 6 7 8 9

代码如下:

vector<double> testDouble;
for(double i=0.1;i<=10;i+=1.1){
	testDouble.push_back(i);
}
//遍历输出testDouble
for(vector<double>::iterator testiter=testDouble.begin();
	testiter!=testDouble.end();testiter++)
	cout<<*testiter<<" ";
cout<<endl;
//将testin初始化为testDouble的副本(类型转换)
vector<int> testint(testDouble.begin(),testDouble.end());
//遍历输出testint
for(vector<int>::iterator testintiter=testint.begin();
	testintiter!=testint.end();testintiter++){
	cout<<*testintiter<<"   ";
}

为什么会出现最后一对「10、9」的输出?

刚开始以为只是double转int的问题,然后测试了下:

vector<double> test;
test.push_back(8.9 + 1.1);
vector<int> testint(test.begin(), test.end());
cout<<*testint.begin()<<endl;

运行结果:

从结果来看并不只是转换的问题。

现在从后面的结果处可以得知: 前面计算后输出的容器元素值8.9与浮点常量8.9不相等

查了不少的资料才发现问题的症结所在

精度问题,计算机里的浮点数不是十进制的,所以不能精确的加出10,那个数大概是9.99999999999998(能输出10是因为浮点数舍入(IEEE 754)),然后转换int就成了9了(截尾)跟容器、迭代器无关。

浮点数的舍入(摘自维基百科IEEE 754):

  • 舍入到最接近:舍入到最接近,在一样接近的情况下偶数优先(Ties To Even,这是默认的舍入方式):会将结果舍入为最接近且可以表示的值,但是当存在两个数一样接近的时候,则取其中的偶数(在二进制中式以0结尾的)。
  • 朝+∞方向舍入:会将结果朝正无限大的方向舍入。
  • 朝-∞方向舍入:会将结果朝负无限大的方向舍入。
  • 朝0方向舍入:会将结果朝0的方向舍入。

解决方案:double转(强制转换)int是截尾,可以使用round函数来四舍五入double类型的值

double round(double);

测试下double赋值时使用round转换后的值(四舍五入了)

再来测试下test.end()-1round(test.end()-1)

结语:遇到需要强制转换数据类型的时候还是需要多注意下该类型的存储方式和运算方式,另外还要抽时间多看看IEEE标准啊。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 详细分析下C++中的类型转换

    在C++中,如果一个运算符的运算对象类型不一致,这些运算对象将转换成同一种类型。 类型转换分为隐式转换、和显式转换。

    查利鹏
  • Java的数据类型

    整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。于此相反,C和C++程序需要针对不同的处理器选择最有效的整形。

    帅飞
  • 阿里P8级架构师怎么处理电商业务中的数值计算的精度/舍入/溢出问题?

    国外计算程序使用的单步计算法。于是,a+b%表示a*(1+b%)。所以,手机计算器实际上在计算10%*(1+10%)= 0.11。

    JavaEdge
  • day 15 - 1 内置函数

    字符串类型代码的执行 eval() exec() compile()  [不常用]

    py3study
  • 【技术】深度学习新技术:HALP可以使用低精度的训练,但不限制准确性

    AiTechYun 编辑:yuxiangyu 使用较少位的精度来训练机器学习模型是否会限制训练的准确性呢?这篇文章描述了一些情况,我们可以通过被称为位中心化(b...

    AiTechYun
  • Python基础语法(三)

    在之前的博客也有提到,数值型数据结构在这里就不过多介绍了。在这里提及一些需要知道的知识点。

    py3study
  • IEEE二进制浮点数算术标准(IEEE 754)

    IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式...

    用户7886150
  • 【STM32F407的DSP教程】第8章 DSP定点数和浮点数(重要)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

    armfly
  • 【STM32F429的DSP教程】第8章 DSP定点数和浮点数(重要)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

    armfly
  • 【STM32H7的DSP教程】第8章 DSP定点数和浮点数(重要)

    完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547

    armfly
  • 格物致知-Floating Point

    之前陆陆续续写了很多架构、设计、思想、组织方向的文字,突然感觉到有些厌烦。因为笔者不断看到有些程序员“高谈阔论、指点江山”之余,各种定律、原则、思想似乎都能信手...

    曲水流觞
  • 详解Python 2.x 与 Python 3.x 的区别

    如果你是刚接触 Python 的初学者,那你可能是直接学习 Python 3.x 版本。对于 Python 2.x 的版本是不会有所接触。官方也宣布在 2020...

    用户2966292
  • Java基础 - 入门

    JAVA不采用通常语言使用的ASCII字符集,而是采用unicode这样的标准的国际字符集

    断痕
  • javascript 基本概念

    一、在HTML中使用javascript 1.直接是用<script></script>标签。 2.外部引入 <script type="javascript"...

    柴小智
  • python学习总结

    希望自己以后在学习Python的过程中可以边学习边总结,就自己之前的学习先做以总结,之后将不断总结更新。

    oYabea
  • 基于 FPGA 的数字表示

    在FPGA系统中有两个基本准则非常重要,分别为:数字表示法和代数运算的实现。本博文主要介绍数字表示。   参考文献:数字信号处理的FPGA实现(第3版)中文版 ...

    碎碎思
  • 【TensorFlow】01 Tenso

    python的变量类型不像C++一样在定义时必须制定参数的变量类型,是一种动态语言

    py3study
  • python 内置函数

    基本的数据操作基本都是一些数学运算(当然除了加减乘除)、逻辑操作、集合操作、基本IO操作,然后就是对于语言自身的反射操作,还有就是字符串操作。

    py3study
  • 7 个棘手的 JavaScript 面试题!

    让我们看一下第 2 行:let a = b = 0,该语句声明一个局部变量 a,然儿,它也声明了全局变量 b。

    Java技术栈

扫码关注云+社区

领取腾讯云代金券