我一直在嘗試使用此代碼:在我的節目之一C++鑄造pow函數的雙重結果的整數
if (iteration % pow(256.0, 7) == 0) {
,但錯誤控制檯說:
錯誤C2297:'%':非法,右操作數類型爲'雙'
我該如何解決這個錯誤?
我一直在嘗試使用此代碼:在我的節目之一C++鑄造pow函數的雙重結果的整數
if (iteration % pow(256.0, 7) == 0) {
,但錯誤控制檯說:
錯誤C2297:'%':非法,右操作數類型爲'雙'
我該如何解決這個錯誤?
,正如你在標題註明,答案是結果轉換爲一個整數:
if (iteration % static_cast<int>(pow(256.0, 7)) == 0)
iteration % pow(256.0, 7)
這裏pow
返回double
。但%
不能應用於double
(或float
)類型。
%
只能在可積類型的應用,例如int
,short
,char
等
我怎樣才能解決這個錯誤得到什麼?
你想達到什麼目的?也許你可以這樣做:
iteration % static_cast<__int64>(pow(256.0, 7))
或者簡單:
const __int64 value = 256ULL * 256 *256 *256 *256 *256 *256;
if (iteration % value == 0)
有沒有方法將pow返回的值轉換爲整數? – user1546083
我相信'pow()'與cast *可能實際上比這個乘法更快。更不用說它會*更具可讀性。無論如何,編譯器會優化它。 –
@MichałGórny:你爲什麼這麼相信?編譯器會在編譯時進行乘法運算,否? – Nawaz
由於pow(256.0, 7)
可以表示爲整數,您應該將其定義爲適當的常量,例如
const int64_t pow_256_7 = 1LL << (8 * 7); // 256^7
,然後做這樣的測試:
if ((iteration % pow_256_7) == 0)
它可以表示爲一個整數,但可能不是'int',因此'1'或'8 * 7'應該轉換爲'int64_t'或使用適當的後綴。 – user786653
當int小於64位時,初始化程序應該是1ULL <<(8 * 7)以避免溢出。 –
謝謝雙方 - 現在修好了。 –
是什麼類型'iteration'? –
它是未簽名的__int64。 – user1546083