2012-08-25 56 views
0

我一直在嘗試使用此代碼:在我的節目之一C++鑄造pow函數的雙重結果的整數

if (iteration % pow(256.0, 7) == 0) { 

,但錯誤控制檯說:

錯誤C2297:'%':非法,右操作數類型爲'雙'

我該如何解決這個錯誤?

+0

是什麼類型'iteration'? –

+0

它是未簽名的__int64。 – user1546083

回答

2

,正如你在標題註明,答案是結果轉換爲一個整數:

if (iteration % static_cast<int>(pow(256.0, 7)) == 0) 
0
iteration % pow(256.0, 7) 

這裏pow返回double。但%不能應用於double(或float)類型。

%只能在可積類型的應用,例如intshortchar

我怎樣才能解決這個錯誤得到什麼?

你想達到什麼目的?也許你可以這樣做:

iteration % static_cast<__int64>(pow(256.0, 7)) 

或者簡單:

const __int64 value = 256ULL * 256 *256 *256 *256 *256 *256; 

if (iteration % value == 0) 
+0

有沒有方法將pow返回的值轉換爲整數? – user1546083

+0

我相信'pow()'與cast *可能實際上比這個乘法更快。更不用說它會*更具可讀性。無論如何,編譯器會優化它。 –

+1

@MichałGórny:你爲什麼這麼相信?編譯器會在編譯時進行乘法運算,否? – Nawaz

2

由於pow(256.0, 7)可以表示爲整數,您應該將其定義爲適當的常量,例如

const int64_t pow_256_7 = 1LL << (8 * 7); // 256^7 

,然後做這樣的測試:

if ((iteration % pow_256_7) == 0) 
+0

它可以表示爲一個整數,但可能不是'int',因此'1'或'8 * 7'應該轉換爲'int64_t'或使用適當的後綴。 – user786653

+0

當int小於64位時,初始化程序應該是1ULL <<(8 * 7)以避免溢出。 –

+0

謝謝雙方 - 現在修好了。 –