C++ 用双值除法发行
为什么“2=”输出会给出令人惊讶的结果,请给出一些提示。在这种情况下,double有什么问题 双值分割的任何约束 <> P>是否有任何选项避免C++中的这些东西?C++ 用双值除法发行,c++,C++,为什么“2=”输出会给出令人惊讶的结果,请给出一些提示。在这种情况下,double有什么问题 双值分割的任何约束 P>是否有任何选项避免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.2
#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;
#包括
#包括
#包括
int main()
{
双d1、d2、d3、d4、d5;
双d=0.010000;
d1=1000000.28;
d2=10000000.28;
d3=100000000.28;
d4=100000000.28;
d5=1000000000.28;
计算精度(15);
cout首先,您程序的输出与您在问题中编写的不同。输出为:
1=100000028
2=1000000027
3=10000000028
4=100000000028
5=1000000000028
不是:
第二,当您编写代码> double d=0.010000 < /COD>时,<代码> d< /代码>没有设置为.01。它被设置为一个接近的值,它可以表示为<代码> double < />代码(在一个好的C++实现中,它被设置为最接近的可表示的值)。您的C++实现中,双 最有可能是IEEE-75 64位二进制浮点值,而最接近的可表示值为01。
类似地,当您写入
d2=10000000.28
时,d2未设置为10000000.28。最接近的可表示值为10000000.279999932944774627685546875
当你除以这些,你会得到一个大约但略小于1000000028的数字。除法的结果是1000000027.99999880790701044921875,四舍五入为一个double
。当你取其中的floor
时,分数会被截断,剩下1000000027
要避免或处理这些问题,需要了解浮点运算以及要执行的特定计算。在这种情况下,我们需要知道为什么要使用floor
答案是复杂的,WhozCraig的评论和他链接到的文档表明了这一点
我能给出的最简单的答案是把浮点数看作是十进制对应的非常接近的近似值(C++没有十进制数据类型)。
一个更容易理解的方法是通过Jon Skeet at的一个很棒的视频。为了清晰起见,这是值得的入场费。这个视频是针对c#的,但概念是一样的。在观看视频之前,我从来都不知道这个问题的存在。首先,煮一壶咖啡,然后阅读。它会改变你对浮动的看法C/C++中的点号。代码没有问题(非标准包含除外),你的假设是错误的。计算机处理整数和浮点数,而不是实数。你需要使用十进制数据类型,而不是二进制数据类型。浮点数是特殊的。我发现这一系列文章很有启发性:@DavidHeffernan:你怎么知道十进制数据类型可以满足所有值的要求OP想要使用?如果将d
设置为.07之类的值,则十进制无法解决问题。是的,输出复制不正确。感谢您的解释。实际输出如下。1=100000028 2=100000027 3=10000000028 4=10000000028 5=10000000028回答得好。重申一下,重要的是要记住float/double可以准确地将重新整数值(浮点值最多为2^24,双精度值最多为2^53),但不能准确存储大多数非整数值。0.5和0.125可以准确存储,但0.2不能准确存储。原因相同,1/3不能准确地用十进制表示,但进行了修改,因为浮点/双精度是以2为基数,而不是以10为基数。
1 = 1000000.28;
2 = 10000000.27;
3 = 100000000.28;
4 = 1000000000.28;
5 = 10000000000.28;