当变量的顺序改变时,C ++双乘法有不同的结果。

时间:2018-01-04 04:40:50

标签: c++ types overflow precision

有些人可以用c ++中使用double数据类型的乘法行为来启发我吗?在下面的示例程序中,我有三个类型为double的变量(x,y,z)。当我将这些变量相乘时,产品会因订单而异。请记住,我在示例中使用的值是我的样本计算值。

void main()
{
    double x, y, z;
    double prod1, prod2;

    x = 8.3832170034737544e-05;
    y = 5.6690000000000000e-08;
    z = 0.29999999999999999;

    prod1 = x*y*z;
    prod2 = y*z*x;

}

结果:

prod1 : 1.4257337157807814e-12
prod2 : 1.4257337157807812e-12

在上面的示例中, prod1 prod2 的结果不同。 我怎样才能解决这个问题,无论(x,y,z)的顺序是什么,并且使用完全相同的值,我总能得到相同的结果。

1 个答案:

答案 0 :(得分:0)

由于浮点类型的精度。

双重保证精确15位小数。

如果您愿意,可以使用long double类型。 但它不是IEEE-754要求的

<div class="col-md-4">
            <figure class="overlay overlay4 light"><a href="#"></a> <img src="style/images/service/tele1.png" alt="" />
             
            </figure>
       </div> 
 
 <div class="col-md-4">
            <figure class="overlay overlay4 light"><a href="#"></a> <img src="style/images/service/broad.png" alt="" />
             
            </figure>
          
		</div>  
		 
		 <div class="col-md-4">
            <figure class="overlay overlay4 light"><a href="#"></a> <img src="style/images/service/broad.png" alt="" />
             
            </figure>
         
 </div>  
 
 <div class="col-md-4">
            <figure class="overlay overlay4 light"><a href="#"></a> <img src="style/images/service/broad.png" alt="" />
             
            </figure>
          
 </div> 
 
  <div class="col-md-4">
            <figure class="overlay overlay4 light"><a href="#"></a> <img src="style/images/service/broad.png" alt="" />
             
            </figure>
        </div>  
 

结果

#include <iostream>

int main(void)
{
    long double x, y, z;
    long double prod1, prod2;

    x = 8.3832170034737544e-05;
    y = 5.6690000000000000e-08;
    z = 0.29999999999999999;

    prod1 = x*y*z;
    prod2 = y*z*x;

    std::cout.precision(17);
    std::cout << prod1 << std::endl;
    std::cout << prod2 << std::endl;

    return 0;
}