2016-01-14 29 views
0

下面的代码正在打印错误输出,用于一些值的同时正确的其他人。 例如输出为699838110是2938640281442109880而它应该是2938640272852175288限制数据类型

#include <iostream> 
#include<cmath> 
using namespace std; 

int main() 
{ 
    int n; 
    cin>>n; 
    for(int i=0; i<n; i++) 
    { 
     int d; 
     cin>>d; 
     if(d==1) 
     { 
      cout<<1<<endl; 
     } 
     else 
     { 
      long long int y=pow(d,2); 
      long long int x=8+6*y-12*d; 
      cout<<x<<endl; 
     } 
    } 
    return 0; 
} 

是因为数据类型长长整型的限制这种情况的发生? 如果不是定义x,我直接在我的cout语句中写入8 + 6 * d * d-12 * d,然后生成垃圾值。这是否意味着cout声明有限制?如果是,那么这个限制是什么,或者是由计算中涉及的变量的数据类型决定的?

+0

首先,这里没有足够的信息能够理解你在找什么;什么是问题?其次,你的问题可能像“x = 8 + 6 * y-12 * d”中的PEMDAS一样简单。你是否在任何地方遗漏括号? –

+1

可能相关:http://stackoverflow.com/a/15256009/4859885 –

回答

1

尝试以下。我相信这个“​​d”变量需要很长的时间。

int main() { 
    long long n; 
    cin>>n; 
    for(long long i=0LL; i<n; i++) 
    { 
     long long d; 
     cin>>d; 
     if(d==1) 
     { 
      cout<<1<<endl; 
     } 
     else 
     { 
      long long y=d*d; 
      long long x=8LL+6LL*y-12LL*d; 
      cout<<x<<endl; 
     } 
    } 
    return 0; 
} 

信用:@Basile Starynkevitch

2

12*d将被计算为int,不long long int。它在更大的表达式中生成long long int的事实不会改变这一点。

如果您int是32位的,则12*d会溢出。这是未定义的行为。一个int不需要代表值比实际32767更大,即使32位整数(能容纳值高达约2147483647左右)在实践中较为常见。

所以你的问题无关,与流的限制。它与表达式中的变量类型和结果有关。

2

pow(d,2)表达 - 使用std::pow - 涉及浮点运算(可能与IEEE floating pointd转换为尾数的double所以53位)。阅读http://floating-point.de/

更好的避免做:

long long int y= d*d; 

甚至更​​好

long long int y = ((long long)d)* d; 

使平方在64位发生算术 这可能更快,更准确的是小幅上涨。

BTW,你应该与所有警告&调试信息(如果使用GCC ...... g++ -Wall -Wextra -g)编译和一步一步运行你在调试器(gdb)程序。这肯定会帮助你自己找到错误。