সি-তে জটিল সংখ্যা নিয়ে কীভাবে কাজ করবেন?


122

আমি কীভাবে জটিল সংখ্যার সাথে কাজ করতে পারি? আমি দেখছি একটি complex.hশিরোলেখ ফাইল আছে, তবে এটি কীভাবে এটি ব্যবহার করতে হয় সে সম্পর্কে আমাকে বেশি তথ্য দেয় না। কীভাবে আসল এবং কল্পিত অংশগুলিকে একটি দক্ষ উপায়ে অ্যাক্সেস করবেন? মডিউল এবং পর্যায়ে পেতে দেশীয় ফাংশন আছে?


16
আমি সি ++ এর পরিবর্তে সি ব্যবহার করছি কারণ আমার পাইথন কোডটি আবদ্ধ করা সহজ।
চার্লস ব্রুনেট

উত্তর:


186

এই কোডটি আপনাকে সহায়তা করবে এবং এটি মোটামুটি স্ব-বর্ণনামূলক:

#include <stdio.h>      /* Standard Library of Input and Output */
#include <complex.h>    /* Standard Library of Complex Numbers */

int main() {

    double complex z1 = 1.0 + 3.0 * I;
    double complex z2 = 1.0 - 4.0 * I;

    printf("Working with complex numbers:\n\v");

    printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", creal(z1), cimag(z1), creal(z2), cimag(z2));

    double complex sum = z1 + z2;
    printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));

    double complex difference = z1 - z2;
    printf("The difference: Z1 - Z2 = %.2f %+.2fi\n", creal(difference), cimag(difference));

    double complex product = z1 * z2;
    printf("The product: Z1 x Z2 = %.2f %+.2fi\n", creal(product), cimag(product));

    double complex quotient = z1 / z2;
    printf("The quotient: Z1 / Z2 = %.2f %+.2fi\n", creal(quotient), cimag(quotient));

    double complex conjugate = conj(z1);
    printf("The conjugate of Z1 = %.2f %+.2fi\n", creal(conjugate), cimag(conjugate));

    return 0;
}

  সঙ্গে:

creal(z1): আসল অংশ পান (ভাসা crealf(z1)জন্য, দীর্ঘ ডাবল জন্য creall(z1))

cimag(z1): কাল্পনিক অংশ পান (ভাসা cimagf(z1)জন্য, দীর্ঘ ডাবল জন্য cimagl(z1))

আরেকটি গুরুত্বপূর্ণ পয়েন্ট মনে রাখা যখন জটিল সংখ্যার সঙ্গে কাজ ফাংশন পছন্দ করে cos(), exp()এবং sqrt()তাদের জটিল ফর্ম, যেমন দিয়ে প্রতিস্থাপিত করা আবশ্যক ccos(), cexp(), csqrt()


12
এটা কি double complex? এটি কি কোনও ভাষা সম্প্রসারণ বা কোনও ম্যাক্রো যাদু?
কলমারিয়াস

@ ক্যালমারিয়াস complexএকটি স্ট্যান্ডার্ড সি 99 টাইপ ( জিসিসিতে হুডের নীচে, এটি আসলে _কম্প্লেক্স টাইপের একটি উপনাম)।
স্নায়াপ

9
@ স্নাইপ: complexকোনও প্রকার নয়। এটি এমন একটি ম্যাক্রো যা প্রসারিত হয় _Complex, যা এক ধরণের নির্দিষ্টকরণকারী , তবে নিজে থেকে কোনও প্রকার নয়। জটিল ধরনের হয় float _Complex, double _Complexএবং long double _Complex
কিথ থম্পসন

3
এটি কেবল জিসিসি নয়, এটি স্ট্যান্ডার্ডে সংজ্ঞায়িত করা হয়েছে যে _ কমপ্লেক্স হ'ল টাইপ স্পেসিফায়ার এবং জটিল .h একই_সুলভ এবং stdbool.h।
jv110

40

কমপ্লেক্স প্রকারগুলি সি ভাষাতে সি 99 মান ( -std=c99জিসিসির বিকল্প) থেকে রয়েছে since কিছু সংকলক জটিলতর প্রকারগুলি আরও আগের মোডগুলিতে প্রয়োগ করতে পারে তবে এটি অ-মানক এবং অ-বহনযোগ্য এক্সটেনশন (যেমন আইবিএম এক্সএল, জিসিসি, ইন্টেল হতে পারে, ...)।

আপনি http://en.wikedia.org/wiki/Complex.h থেকে শুরু করতে পারেন - এটি জটিলতা থেকে ফাংশনগুলির বিবরণ দেয়

এই ম্যানুয়ালটি http://pubs.opengroup.org/onlinepubs/009604499/basedefs/complex.h.html ম্যাক্রো সম্পর্কে কিছু তথ্য দেয়।

একটি জটিল ভেরিয়েবল ঘোষণা করতে, ব্যবহার করুন

  double _Complex  a;        // use c* functions without suffix

অথবা

  float _Complex   b;        // use c*f functions - with f suffix
  long double _Complex c;    // use c*l functions - with l suffix

জটিলটিতে একটি মান দেওয়ার জন্য, _Complex_Iথেকে ম্যাক্রো ব্যবহার করুন complex.h:

  float _Complex d = 2.0f + 2.0f*_Complex_I;

( (0,-0i)জটিলতার একক অর্ধায় সংখ্যার এবং NaN সহ এখানে কিছু সমস্যা হতে পারে )

মডিউলটি cabs(a)/ cabsl(c)/ cabsf(b); আসল অংশটি হচ্ছে creal(a), কালিরিয়াল cimag(a)carg(a)জটিল যুক্তি জন্য।

সরাসরি কোনও চিত্রের অ্যাক্সেস (পড়ুন / লেখার জন্য) আপনি এই অপ্রয়োজনীয় জিসিসি-এক্সটেনশনটি ব্যবহার করতে পারেন :

 __real__ a = 1.4;
 __imag__ a = 2.0;
 float b = __real__ a;

1
প্রায় প্রতিটি জটিল ফাংশন কার্যকরী উপায়ে বিল্টিন ফাংশন হিসাবে সংকলক দ্বারা কার্যকর করা হবে। কেবলমাত্র আধুনিক সংকলক ব্যবহার করুন এবং এটিকে কিছু শূন্য-স্তরের অপটিমাইজেশন দিন।
ওসজিএক্স

3
এফওয়াইআই, যেহেতু ওপি পাইথন বাইন্ডিংয়ের উল্লেখ করেছে, পাইথনের সাথে কাজ করার সময় আমি সি ৮৯-র সাথে লেগে থাকার চেষ্টা করি (যেহেতু পাইথনের বাকী কোডটি C89, এবং আপনি যদি উইন্ডোজটিতে আপনার এক্সটেনশন চালাতে চান তবে এটি সাধারণত এমভিএসসি দিয়ে সংকলিত হয় যা সীমাবদ্ধ থাকে) C89)। আমি জানি না যদিও এটি কঠোরভাবে প্রয়োজনীয়।
সূচিতভাবে

1
(complex float) { r, i }সংখ্যার পৃথক অংশ সেট করতে এবং স্বতন্ত্রভাবে অভিব্যক্তিটিও ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ, কল্পিত অংশটি এনএএন হওয়ার সময় আসল অংশটি আইএনএফ হতে দেয়)। এটি জিসিসি-নির্দিষ্ট কীওয়ার্ড এড়িয়ে যায়, যদিও এটি নিশ্চিতভাবে পোর্টেবল কিনা তা আমি নিশ্চিত নই।
ক্লোং

2
নোট করুন যে কমপ্লেক্স সমর্থন সি 99 এ alচ্ছিক: সংকলকরা সংজ্ঞা দিলে কেবল এটি নাও থাকতে পারে __STDC_NO_COMPLEX__। বাস্তবে তবে এটি বড় সংকলকগুলিতে প্রয়োগ করা হয়।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

1
জেসেন, এন 1256 খসড়া ওপেন- std.org/jtc1/sc22/wg14/www/docs/n1256.pdf# পৃষ্ঠা=182 এর পৃষ্ঠা 182 দেখুন "7.3 কমপ্লেক্স পাটিগণিত <জটিল h >"। বিদ্যমান কি (সি 90) প্রোগ্রামগুলি যাতে হাত দ্বারা জটিল প্রয়োগ করে তা না ভাঙার জন্য সম্ভবত এই জাতীয় কীওয়ার্ডটি সি 99 এ নির্বাচন করা হয়েছিল। <জটিল.কম> অন্তর্ভুক্ত complexকরা হলে ম্যাক্রো হিসাবে সংজ্ঞায়িত করা হবে, এতে প্রসারিত হবে _Complex। আপনি ডেরেক এম জোনসের "দ্য নিউ সি স্ট্যান্ডার্ড: একটি ইকোনমিক অ্যান্ড কালচারাল কমেন্টারি" (২০০৮) পৃষ্ঠা 500 "জটিল ধরণের" people.ece.cornell.edu/land/courses/ece4760/…
ওএসজিএক্স

9

Complex.h

#include <stdio.h>      /* Standard Library of Input and Output */
#include <complex.h>    /* Standart Library of Complex Numbers */

int main() 
{
    double complex z1 = 1.0 + 3.0 * I;
    double complex z2 = 1.0 - 4.0 * I;

    printf("Working with complex numbers:\n\v");

    printf("Starting values: Z1 = %.2f + %.2fi\tZ2 = %.2f %+.2fi\n", 
           creal(z1), 
           cimag(z1), 
           creal(z2), 
           cimag(z2));

    double complex sum = z1 + z2;
    printf("The sum: Z1 + Z2 = %.2f %+.2fi\n", creal(sum), cimag(sum));
}

4

সুবিধার্থে tgmath.hম্যাক্রো জেনারেট টাইপের লাইব্রেরি অন্তর্ভুক্ত থাকতে পারে । এটি সকল ধরণের ভেরিয়েবলের ডাবল সংস্করণ হিসাবে একই ফাংশনটির নাম তৈরি করে। উদাহরণস্বরূপ, উদাহরণস্বরূপ, এটি একটি সংজ্ঞায়িত sqrt()ম্যাক্রো যে বিস্তৃতি sqrtf(), sqrt()অথবা sqrtl()ফাংশন, যুক্তি ধরণ প্রদান উপর নির্ভর করে।

সুতরাং বিভিন্ন ধরণের ভেরিয়েবলের জন্য সংশ্লিষ্ট ফাংশনটির নামটি মনে রাখার দরকার নেই!

#include <stdio.h>
#include <tgmath.h>//for the type generate macros. 
#include <complex.h>//for easier declare complex variables and complex unit I

int main(void)
{
    double complex z1=1./4.*M_PI+1./4.*M_PI*I;//M_PI is just pi=3.1415...
    double complex z2, z3, z4, z5; 

    z2=exp(z1);
    z3=sin(z1);
    z4=sqrt(z1);
    z5=log(z1);

    printf("exp(z1)=%lf + %lf I\n", creal(z2),cimag(z2));
    printf("sin(z1)=%lf + %lf I\n", creal(z3),cimag(z3));
    printf("sqrt(z1)=%lf + %lf I\n", creal(z4),cimag(z4));
    printf("log(z1)=%lf + %lf I\n", creal(z5),cimag(z5));

    return 0;
}

2

জটিল সংখ্যার ধারণাটি গণিতে চালু হয়েছিল, নেতিবাচক চতুর্ভুজ শিকড় গণনা করার প্রয়োজন থেকে from কমপ্লেক্স নম্বর ধারণাটি বিভিন্ন প্রকৌশল ক্ষেত্রে নেওয়া হয়েছিল।

আজ জটিল সংস্থাগুলি পদার্থবিজ্ঞান, ইলেকট্রনিক্স, মেকানিক্স, জ্যোতির্বিজ্ঞান ইত্যাদির মতো উন্নত প্রকৌশল ডোমেনগুলিতে ব্যাপকভাবে ব্যবহৃত হয় ...

একটি নেতিবাচক বর্গমূলের উদাহরণের আসল এবং কাল্পনিক অংশ:

#include <stdio.h>   
#include <complex.h>

int main() 
{
    int negNum;

    printf("Calculate negative square roots:\n"
           "Enter negative number:");

    scanf("%d", &negNum);

    double complex negSqrt = csqrt(negNum);

    double pReal = creal(negSqrt);
    double pImag = cimag(negSqrt);

    printf("\nReal part %f, imaginary part %f"
           ", for negative square root.(%d)",
           pReal, pImag, negNum);

    return 0;
}

-1

একটি জটিল-মূল্যবান মত প্রকাশের বাস্তব অংশ বের করে আনতে z, যেমন স্বরলিপি ব্যবহার __real__ z। একইভাবে, কাল্পনিক অংশটি নিষ্কাশন করতে __imag__অ্যাট্রিবিউট ব্যবহার করুন z

উদাহরণ স্বরূপ;

__complex__ float z;
float r;
float i;
r = __real__ z;
i = __imag__ z;

r হল জটিল সংখ্যার আসল অংশ "z" আমি জটিল সংখ্যার কাল্পনিক অংশ "z"


2
এগুলি জিসিসি-নির্দিষ্ট এক্সটেনশন। অন্য উত্তর ইতিমধ্যে তাদের উল্লেখ করেছে এবং মানক সিতে এটি কীভাবে করা যায় তা ইতিমধ্যে গৃহীত উত্তর
কেইথ থম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.