C ++ double / float的内部表示形式

问题描述 投票:1回答:4

我无法理解为什么C ++除法会表现出这种方式。我有一个简单的程序,该程序将1除以10(使用VS 2003)

double dResult = 0.0;
dResult = 1.0/10.0;

我期望dResult为0.1,但是我得到0.10000000000000001

  1. 为什么要获得此值,double / float的内部表示形式有什么问题?>
  2. 我如何获得正确的值?
  3. 谢谢。

我无法理解为什么C ++除法会表现出这种方式。我有一个简单的程序,将1除以10(使用VS 2003)double dResult = 0.0; dResult = 1.0 / 10.0;我期望dResult为0.1,...

c++ division
4个回答
3
投票

因为all


2
投票

双精度和浮点数与实数并不相同,这是因为实数有无限个值,但是只有有限数量的位以双精度/浮点数表示它们。


2
投票

普遍存在的IEEE754浮点格式以有限的尾数以科学记数法2表示浮点数。由于分数1/5(因此是1/10)没有二进制数形式的有限位数表示,因此您无法精确表示值0.1。更一般地,唯一能精确表示的值是那些精确地适合二进制科学计数法的值,其尾数为几个(例如24或53或64)二进制数字,并且具有适当的小指数。


0
投票

使用整数,浮点数和双精度数可能会很棘手。取决于您的目的。如果只想以漂亮的格式显示,则可以使用C ++ iomanipulator,precision,showpint,noshowpint。如果您尝试使用数值方法进行精确计算,则可能必须使用一些库来精确表示。如果您要乘以大量的小数和大数,则可能不得不停下来使用对数转换。这是一个小测试:

© www.soinside.com 2019 - 2024. All rights reserved.