2016-01-14 127 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)程序。這肯定會幫助你自己找到錯誤。