浮点倍数和股息精度问题
float point multiple and divident precision problem
我在C++代码中遇到浮点精度问题
给定double d = 32.4;
d / 0.01 == 3240.0;
给出真,而
d / 0.1 == 324.0
给出假。
但是如果我乘以 10 和 100,那么结果都是真的。
由于 32.4、324 和 3240 都可以用 64 位双精度表示,没有任何精度损失,所以这个结果对我来说很困惑。(我对浮点运算中的乘数和股息操作不是很熟悉(
在我的用例中,我将通过简单地乘以或除以 0.1、0.01、0.05 之类的东西在不同比例之间进行一些转换。我的意思是,我不需要很高的精度,我的操作数通常小于 6 位小数,可以用 64 位双精度表示而不会损失精度,所以我想得到一致的结果。我有一个猜测:在我的用例中,我应该总是使用乘法而不是除法吗?
您似乎对浮点类型可以表示的值有误。
值 32.4 不能用任何二进制浮点格式精确表示,0.1 或 0.01 也不能。 它看起来像一个重复的小数。 它与值 1/3 相同,也不能以十进制格式精确表示,即 0.3333333333333.... 因此,具有这些值的任何算术都不会精确。
在这种情况下,您可以做的最好的事情是将浮点值的除法更改为整数值的乘法,例如。 / 0.1
--> * 10
. 即使这样,结果也不会准确,因为无法准确表示 32.4 的原始值。 您需要将结果四舍五入为整数值才能获得准确的结果。
相关文章:
- 高精度双精度的 Sprintf 格式化问题
- C++正确书写和打印复数精度 (cout) 的问题?
- 从 C++ 中的函数返回双精度的问题
- C++,遇到将双精度转换为整数的问题
- 在浮点精度成为一个问题之前,可以将多少个浮点值加在一起
- ceil、floor 和 round 在转换为整数时会遇到精度损失问题吗?
- 向量<对<双精度,双精度>>给出问题
- 浮点倍数和股息精度问题
- 使用boost多精度的数学精度问题
- 使用 qt 和 opengl、定时精度和垂直同步问题、c++ 显示图像
- 使用设置精度在C++中舍入小数点时出现问题
- 使用提升多精度库时出现问题
- 二进制表达式的语义问题无效操作数("双精度"和"双精度")
- 着色器中实现双精度cos()的结果是NaN,但在CPU上运行良好.出了什么问题
- 精度问题 - 远离原点的观点 - OpenGL C++
- C++精度问题
- 光线投射算法中的精度问题
- 在c++和Oracle数据库之间传递数据时出现浮点精度问题
- C++(双精度)0.700 * int(1000) => 699(不是双精度问题)
- sscanf的精度问题