2011-02-07 4 views
2

Я нашел этот код структуры в примере Julia Set из книги на CUDA. Я программист новичков 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) Что возвращается? (Или помещены в структуру?) Как мне работать через логику материала оператора в структуре, чтобы понять, что на самом деле рассчитано и удерживается там?

Я думаю, что это, вероятно, делать рекурсивные вызовы обратно в stucture

float magnitude2 (void) { return return r * r + i * i; } 

вероятно называет оператор «*» для г и снова для I, а затем результаты этих двух операций называют «+» оператор? Это правильно и что возвращается на каждом шагу?

Just plain confused.

Спасибо!

+1

это похоже на C++, и вам нужно сначала прочитать книгу начинающих на C++: http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list is хорошее начало. В этом простом фрагменте слишком много специальных конструкций C++, чтобы объяснить их как ответ на этот вопрос. – Nim

+0

@Nim: Не полезно. Какую новичку вы считаете, что он отсутствует? – TheBlastOne

+0

@TheBlastOne, следовательно, почему это комментарий ... в любом случае, обновил исходный комментарий примерно в то же время, что и ваш комментарий .. – Nim

ответ

1

Как вы сказали, cuComplex имеет два значения для вещественной (r) и мнимой (i) части числа. Конструктор просто присваивает значение r и i.

Оператор * работает над номерами cuComplex. Операторы multiply и add будут вызываться только в том случае, если вы умножаете два cuComplex isntances вместе.

Они просто там, чтобы упростить вам код. Без оператора вы должны сделать операцию добавить себя:

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; 

Я думаю, что это, вероятно, делает рекурсивные вызовы обратно в stucture

float magnitude2 (void) { return return r * r + i * i; } 

Это не так, поскольку r и i плавают. Операторы * и + перегружены для cuComplex not float

1

r и i являются членами структуры, объявленной как float. Выражение в функции magnitude2 просто выполняет стандартную арифметику float со значениями, хранящимися в этих членах.

Функции оператора, определенные в структуре, используются, когда операторы * и + применяются к переменной типа структуры, например, в строке a = a * a + c.

1

Это реализация на С ++ сложного числа, предоставляющая метод для возврата величин и перегрузок операторов для сложения и умножения. Реальные (r) и мнимые части (i) хранятся отдельно.

a * a + c называет перегруженные методы: (a.operator*(a)).operator+(c)

Он появляется у вас очень мало схватывание даже синтаксиса C (return r * r + i * i; возвращает r раз r плюс i раз i), поэтому я предлагаю вам прочитать введение новичка в C/C++ , а затем введение в комплексные числа, а затем чтение на перегрузку оператора на C++.

0

Вы должны пометить этот вопрос C++, не C (даже если у вас есть struct, это один имеют конструктор и переопределяют операторы, которые являются типичными для объектно-ориентированных концепций).

Эта структура определяет комплексные числа, позволяет умножать (через operator*), добавлять их (через operator+) и получать их модуль (через magnitude2).

В ожидании; у вас есть одно постоянное комплексное число, c и a, другое комплексное число , которое не является постоянным, данное пользователем, возможно, по координатам jx и jy. На каждой итерации цикла a сам по себе усваивается, и к этому результату добавляется c.

Если в какой-то момент a имеет модуль больше 1000, концы цикла завершаются. Я думаю, это тестовая программа, чтобы увидеть, как растет модуль a в соответствии с начальными условиями, заданными пользователем.

1

Это не простая структура, а класс (который в основном представляет собой структуру с функциями) и является C++.

cuComplex c(-0.8, 0.156); 

Здесь он создает экземпляр этого класса и устанавливает 2 значения с помощью вызова конструктора (специальной функции, которая инициализирует экземпляр поле класса).

Это, вероятно, не будет иметь достаточного смысла, поэтому я предлагаю вам изучить книгу на C++. Ускоренный C++ - хороший выбор, если вы уже знаете какое-то программирование.

1

Оператор умножения просто принимает вещественную и мнимую часть аргумента a и добавляет их к действительной и мнимой части объекта, к которому обращается оператор, и возвращает новый объект комплексного числа результата. Я добавил указатель это уточнить:

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 & а) { возврата cuComplex (этом-> г + a.r, этом-> я + а.и.); }

Для цикла, это кажется мнимым число умножается сам с собой (что приводит к вращению в Re-Im-плоскости и и постоянный мнимая с не добавляются в каждой итерации до величины (длина) результата превышает определенный порог.

Обратите внимание, что как оператор *, так и оператор +, а также функция magn2() являются членами структуры cuComplex и, следовательно, этот указатель доступен.

Надеюсь, что это поможет.

0

Если вы знакомы с понятием классов, замените слово «struct» на «class», это значительно упрощает понимание.

«класс» содержит две переменные r и i, конструктор, который принимает два аргумента float, оператор для умножения, оператор для добавления и функцию для вычисления величины.

0

В C++ просто используйте std::complex<float>.

+2

@downvoter: объясните, пожалуйста, нижний опрос старого ответа, чтобы другие могли узнать из вашего (отсутствия) понимания. –

+1

Я не был нисходящим, но если бы я был опасен, почему бы и нет, это было бы потому, что это Вопрос NVIDIA CUDA, а не C++, и CUDA не поддерживает стандартную библиотеку C++. В CUDA нет 'std :: complex'. – talonmies

Смежные вопросы