c++中double型除以整型 希望高手能帮我解答一下 非常感谢

这是代码
#include <iostream>
#include <cmath>
using namespace std;
void main(){
long int i=0;
double sum=0,term,pi;
do{
i+=1;
term=1.0/(i*i);
sum+=term;}
while (term>1e-12);
pi=sqrt(sum*6);
cout<<"pi="<<pi<<endl;
}
运行之后 pi=3.14159

但是如果把第五行改为long double i=0 的话就运行结果为3.14159
我想知道他们有什么不同吗??? 还有就是double型除以整型会得到什么结果
非常感谢
不好意思 第一次运行结果为3.14157
修改为long double 后结果为3.14159

改之前与之后结果应该是相同的。这里主要涉及到C++中类型转换问题。、

long int i=0;//把i声明并初始化为长整形
term=1.0/(i*i);//对于1.0这个常量,C++编译器会自动把它转换为double类型,这个除法在运算过程中自动将int转化double,这是隐式转换,编译器自动完成的。

如果声明为long double i=0;//结果是一样的,只是不必进行类型转换而已。
不明白可以继续问我。追问

不好意思 是我问题打错了 如果用long int 的话运行结果是3.14157这个是错的
只要把int改为double的话就是3.14159了 这个是正确结果 我就不知道咋回事了 纠结啊

追答

我特意编译了这段代码,确实有这个问题。
把term=1.0/(i*i);改成term=1.0/(double(i)*i);就好了。问题可能出在long int的数据溢出上。

在我的机器上long int与int同样占四个字节,两个long int相乘,产生的临时数据也是个long int类型,数据大一点的话会导致数据溢出,从而产生上述结果。
改成term=1.0/(double(i)*i)以后,分母是一个double与int相乘,运算结果是一个double类型,所以不存在数据溢出问题。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-28
首先double型比int型,更加的精确,在两者运行时,自动将int型转换成double型,
你可以试一试10/3=?,10/3.0=?;运行一下这两者之间区别,或许就能明白点!
第2个回答  2020-04-21
C语言算术表达式的计算,在计算过程中,每一步计算所得结果的数据类型由参与运算的运算对象决定,相同数据类型的两个对象运算,结果数据类型不变,不同数据类型的运算对象进行运算,结果的数据类型由高精度的运算对象决定。
第3个回答  2013-03-28
C语言算术表达式的计算,在计算过程中,每一步计算所得结果的数据类型由参与运算的运算对象决定,相同数据类型的两个对象运算,结果数据类型不变,不同数据类型的运算对象进行运算,结果的数据类型由高精度的运算对象决定。精度的高低:double>float>int
需要注意的是,数据类型的转换是在计算过程中逐步进行的,整个表达式结果的数据类型一定与表达式中出现的精度最高的数据相同,但是具体得到数据值是逐步得到的,例如:int x=1,y=3; double k=1573.267;
x / y * k
这个表达式计算结果的数据类型是double, 计算结果的答案是 0.0
因为在第一步 x/y 的计算中 结果是一个整型数据 0
第二步计算 0 * 1573.267 结果是一个double类型的数据,但数值是0.0
也就是说,算术表达式计算结果的数据类型与运算的优先级没有关系,一定具有表达式中精度最高的数据类型,但是具体得到数据结果数值,与优先级可就有关系啦。

double /int = double追问

你好 谢谢你的回答 我刚刚打错了
就是我想知道那两种运行结果不同的原因

相似回答