یک عدد مختلط به شکل z = a + b * i بیان میشود، که در آن:
a بخش حقیقی است (یک عدد حقیقی)،
b بخش موهومی است (آن هم یک عدد حقیقی) و
i یکهی موهومی است که در رابطهی i^2 = -1 صدق میکند.
مزدوج عدد مختلط z = a + b * i به این صورت به دست میآید:
zc = a - b * i
قدر مطلق (یا مدول) عدد z به این صورت تعریف میشود:
|z| = sqrt(a^2 + b^2)
مربع قدر مطلق برابر است با حاصلضرب z در مزدوجش zc:
|z|^2 = z * zc = a^2 + b^2
مجموع دو عدد مختلط z1 = a + b * i و z2 = c + d * i با جمع کردن بخشهای حقیقی و موهومی آنها بهطور جداگانه محاسبه میشود:
z1 + z2 = (a + b * i) + (c + d * i)
= (a + c) + (b + d) * i
تفاضل دو عدد مختلط از تفریق بخشهای متناظرشان به دست میآید:
z1 - z2 = (a + b * i) - (c + d * i)
= (a - c) + (b - d) * i
حاصلضرب دو عدد مختلط به این صورت تعریف میشود:
z1 * z2 = (a + b * i) * (c + d * i)
= (a * c - b * d) + (b * c + a * d) * i
معکوس یک عدد مختلط غیرصفر به این صورت به دست میآید:
1 / z = 1 / (a + b * i)
= a / (a^2 + b^2) - b / (a^2 + b^2) * i
تقسیم یک عدد مختلط بر عددی دیگر به این صورت است:
z1 / z2 = z1 * (1 / z2)
= (a + b * i) / (c + d * i)
= (a * c + b * d) / (c^2 + d^2) + (b * c - a * d) / (c^2 + d^2) * i
رساندن e (پایهی لگاریتم طبیعی) به توانی مختلط را میتوان با فرمول اویلر بیان کرد:
e^(a + b * i) = e^a * e^(b * i)
= e^a * (cos(b) + i * sin(b))
با توجه به اینکه نباید از پشتیبانی داخلی زبان برای اعداد مختلط استفاده کنید، این عملیات را پیادهسازی کنید:
به توان رساندن اعداد مختلط به یک تابع نمایی، یک تابع سینوس و یک تابع کسینوس نیاز دارد. هیچکدام از این توابع در WebAssembly در دسترس نیستند. خوشبختانه میتوان برای محاسبهی آنها از سری تیلور استفاده کرد. برای همراستایی با مقادیر مورد انتظار، باید حداقل دقتی در حد 1/26! داشته باشید.
exp(x) ≃ 1 + x + x ^ 2 / 2! + x ^ 3 / 3! + x ^ 4 / 4! + ... + x ^ n / n!
sin(x) ≃ x - x ^ 3 / 3! + x ^ 5 / 5! - x ^ 7 / 7! + ... - x ^ n / n!
cos(x) ≃ 1 - x ^ 2 / 2! + x ^ 4 / 4! - x ^ 6 / 6! + ... - x ^ n / n!
در Exercism ثبتنام کنید تا WebAssembly را همراه با 87 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.