在处理浮点数时避免不稳定的小数字
Avoiding erratic tiny numbers when working with floating point numbers
有时候,当我在c++中使用浮点数时,只使用数字的倍数,比如0.1,作为for循环中的增量,循环迭代器的实际数字并不完全是0.1的倍数,而是不可预测地添加或减去1^-17数量级的微小数字。我怎样才能避免呢?
使用整数进行迭代,并在使用前乘以浮点数自增。
或者找到一个十进制数学包并使用它来代替浮点数。
不要迭代浮点数
问题是0.1不能精确地用浮点数表示。所以,你应该这样做:
for (int i = 0; i < N; i++)
{
float f = i * 0.1f;
...
}
这是一篇关于如何使用浮点数的优秀文章。有一个讨论正好涵盖了您的示例—0.1的增量:
for (double r=0.0; r!=1.0; r+=0.1) printf("*");
它要打印多少颗星星?十个?运行它并获得惊喜。代码会一直输出星号,直到我们打破它。
有什么问题吗?正如我们已经知道的,双精度不是无限精确的。我们在这里遇到的问题如下:在二进制中,0.1的表示不是有限的(因为它是以10为基数的)。十进制0.1相当于二进制0.0(0011),其中括号中的部分永远重复。当0.1存储在双变量中时,它将四舍五入到最接近的可表示值。因此,如果我们把它加10次,结果并不完全等于1。
如果你经常使用浮点数,我强烈建议你阅读整篇文章。
相关文章:
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 我不知道为什么复制构造函数的调用在 c++ 中不稳定
- ArUco姿态估计中的不稳定值
- 当我使用 fstream 与 for 一起使用时值不稳定,C++
- 不稳定的C :每行适应性变化多变量初始化
- 加入向量的所有线程后,程序不稳定,而不是退出
- clEnqueueWriteImage 在执行时间上不稳定
- 不稳定:如何设置初始化器列表和函数参数的凹痕
- 图形场景中的方位角公式计算会产生不稳定的结果
- 配置不稳定以添加括号
- 为什么在iOS枚举中使用十六进制而不是小数
- 向量中的项目的指针不稳定
- C++ 今天的多线程,C++ 11 的不稳定情况 - 书籍建议
- 分析计时不稳定
- C++不显示小数位数的数字
- 格式化构造构件成员初始化,不稳定
- 可以不稳定和/或通用的GUI划分字符串文字
- C++11 中不稳定 - 随访
- 为什么这个模拟中的摩擦力会使物体的行为不稳定
- 构建 Z3 不稳定分支时出错