[英]What does this structure actually do?
我在有關CUDA的書中的Julia Set示例中找到了此結構代碼。 我是C語言的新手程序員,無法理解所做的事情,也找不到合適的東西在網上閱讀以進行清理。 結構如下:
struct cuComplex {
float r;
float i;
cuComplex( float a, float b ) : r(a), i(b) {}
float magnitude2( void ) { return r * r + i * i; }
cuComplex operator*(const cuComplex& a) {
return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
}
cuComplex operator+(const cuComplex& a) {
return cuComplex(r+a.r, i+a.i);
}
};
它的名稱非常簡單,如下所示:
cuComplex c(-0.8, 0.156);
cuComplex a(jx, jy);
int i = 0;
for (i=0; i<200; i++) {
a = a * a + c;
if (a.magnitude2() > 1000)
return 0;
}
return 1;
那么,代碼做了什么? 定義了結構類型“ cuComplex”的東西,給出了數字的實部和虛部。 (-0.8&0.156)返回什么? (或放置在結構中?)我如何通過結構中運算符的邏輯來理解實際計算並保存在其中的內容?
我認為它可能正在對結構進行遞歸調用
float magnitude2 (void) { return return r * r + i * i; }
可能為r調用了'*'運算符,又為i調用了該運算符,然后這兩個運算的結果稱為'+'運算符? 這是正確的嗎,每一步返回什么?
只是很困惑。
謝謝!
就像您說的那樣,cuComplex保留數字的實數(r)和虛數(i)的兩個值。 構造函數只是將值分配給r和i。
*運算符正在處理cuComplex數字。 僅當將兩個cuComplex符號相乘在一起時,才會調用乘法和加法運算符。
它們只是為了簡化您的代碼。 沒有操作員,您將必須自己執行添加操作:
cuComplex c(-0.8, 0.156);
cuComplex a(jx, jy);
// Add, both operations are equivalent.
cuComplex result1 = cuComplex(c.r + a.r, c.i + a.i);
cuComplex result2 = c + a;
至於代碼
cuComplex c(-0.8, 0.156); // Create cuComplex instance called c
cuComplex a(jx, jy); // Create cuComplex instance called a
int i = 0;
for (i=0; i<200; i++) {
a = a * a + c; // Use the * and + operator of cuComplex
if (a.magnitude2() > 1000)
return 0;
}
return 1;
我認為它可能正在對結構進行遞歸調用
float magnitude2 (void) { return return r * r + i * i; }
不是因為r和i都是浮點數。 *和+運算符重載,因為cuComplex不浮動
r
和i
是聲明為float
的結構的成員。 magnitude2
函數中的表達式只是對存儲在這些成員中的值進行標准的浮點運算。
當將運算符*
和+
應用於結構類型的變量時,例如在a = a * a + c
行中,將使用結構中定義的運算符功能。
它是復數的C ++實現,提供了一種返回大小和運算符重載以進行加法和乘法運算的方法。 實數( r
)和虛數( i
)分別存儲。
a * a + c
調用重載方法: (a.operator*(a)).operator+(c)
看來您幾乎不了解C語法( return r * r + i * i;
返回r
乘以r
加上i
乘以i
),因此,建議您閱讀C / C ++的初學者介紹,然后再介紹復數。數字,然后閱讀C ++中的運算符重載。
這不是一個簡單的結構,而是一個類(基本上是具有函數的結構),並且是C ++。
cuComplex c(-0.8, 0.156);
在這里,他創建了此類的實例,並通過調用構造函數(用於初始化該類的實例字段的特殊函數)來設置2個值。
這可能沒有足夠的意義,所以我建議您學習一本C ++書。 如果您已經知道一些編程,那么加速C ++是一個不錯的選擇。
乘法運算符僅取參數a的實部和虛部,然后將它們與調用該運算符的對象的實部和虛部相加,然后返回結果的新復數對象。 我添加了this指針來闡明:
cuComplex operator*(const cuComplex& a) {
// first constructor argument is the real part, second is the imaginary part
return cuComplex(this->r*a.r - this->i*a.i, this->i*a.r + this->r*a.i);
}
加法運算符也是如此。 再次創建並返回類型為cuComplex的新對象的副本。 這次,它的實部和虛部是該對象和參數各自字段的總和。
cuComplex運算符+(const cuComplex&a){return cuComplex(this-> r + ar,this-> i + ai); }
對於循環,似乎虛數a與其自身相乘(導致Re-Im平面旋轉),並且在每次迭代中添加恆定的虛數c ,直到結果的大小(長度)超過某個閾值。
請注意,operator *和operator +以及函數itude2()都是結構cuComplex的成員,因此此指針可用。
希望能有所幫助。
您應該將此問題標記為C++
而不是C
(即使您具有struct
,該問題也具有構造函數並重新定義作為典型的面向對象概念的運算符)。
該結構定義了復數,允許相乘(通過operator*
),將它們相加(通過operator+
)並獲得其模塊(通過magnitude2
)。
在開始時 您有一個常數復數c
和a
,另一個不是常數的復數,可能由用戶通過坐標jx
和jy
。 在循環的每次迭代中, a
自身都是可變的,並且c
被添加到該結果中。
如果在某些時候a
已經超過了一個更大的模塊1000
,循環結束。 我猜這是一個測試程序,用於查看a
模塊如何根據用戶給出的初始條件進行擴展。
如果您熟悉類的概念,則將“ struct”一詞替換為“ class”,這將使它更容易理解。
“類”包含兩個變量r和i,一個帶有兩個浮點arg的構造函數,一個用於相乘的運算符,一個用於相加的運算符,以及一個計算幅度的函數。
在C ++中,只需使用std::complex<float>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.