为什么“2 =“输出给出令人惊讶的结果,请说明一下。在这种情况下,double有什么问题?

double 值除法的任何限制。

是否有任何选择可以避免c++中的此类情况。

#include<iostream.h>
#include<iomanip.h>
#include<math.h>
int main()
{
    double d1,d2,d3,d4,d5;
double d = 0.010000;

d1 = 1000000.28;
d2 = 10000000.28;
d3 = 100000000.28;
d4 = 1000000000.28;
d5 = 10000000000.28;

cout.precision(15);

cout<<"1="<<floor(d1/d)<<endl;
cout<<"2="<<floor(d2/d)<<endl;
cout<<"3="<<floor(d3/d)<<endl;
cout<<"4="<<floor(d4/d)<<endl;
cout<<"5="<<floor(d5/d)<<endl;

return 0;
  }

 o/p
 ====
1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;

最佳答案

首先,程序的输出与您在问题中编写的输出不同。输出为:

1=100000028
2=1000000027
3=10000000028
4=100000000028
5=1000000000028

不:
1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;

其次,当您编写double d = 0.010000时,d未设置为.01。它设置为一个可表示为double的接近值。 (在良好的C++实现中,将其设置为最接近的可表示值。)在您的C++实现中,double最有可能是IEEE-754 64位二进制浮点值,最接近的.01可表示值是0.01000000000000000020816681711721685132943093776776880880375。

同样,当您编写d2 = 10000000.28时,d2也未设置为10000000.28。最接近的可表示值为10000000.27999999932932944774627685546875。

对它们进行除法时,得到的数字大约为1000000028,但略小于1000000028。除法的结果四舍五入为double,结果为1000000027.99999988079071044921875。当您使用floorfloor时,该分数将被截断,剩下1000000027。

要避免或处理这些问题,需要具备有关浮点运算和要执行的特定计算的知识。在这种情况下,我们需要知道为什么要使用ojit_code。

关于c++ - 双值除法问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17927733/

10-11 22:56
查看更多