علوم وفضاء

sign: هل تلغي الجزء التخيلي؟

جزآ الناتج في أربعة أمثلة.
رسم أصلي للتشغيل المسجل.

تعرف الوثائق sign المركبة بالنسبة z/|z| لغير الصفر. [1] نقرأ جزأي الناتج في تشغيل محدد.

ابدأ بالتعريف المحدد

للعدد المركب غير الصفري تعطي sign النسبة z/|z|، وتعطي صفرًا عندما يكون المدخل صفرًا. تنص الوثائق على تغير تعريف الإشارة المركبة في الإصدار 2.0.0. [1]

نختبر هنا NumPy 2.3.5. لا ننقل تعريف إصدار قديم إلى تشغيلنا، ولا نقارن مخرجات بيئتين؛ لم نشغّل NumPy 1.x. نثبت الإصدار والنوع مع القيم قبل أن نقرأ كلمة «إشارة».

نستخدم j في كتابة الشيفرة المركبة. سؤال المقال عن أجزاء الناتج المسجل؛ لا نحسب دالة إشارة مصفوفية طيفية ولا نختبر بت إشارة الصفر.

شغّل أربعة عناصر

أنشأنا z=np.array([6+8j,-8+6j,-5j,0j],dtype=np.complex128)، ثم y=np.sign(z) دون out أو where أو اختيار dtype للناتج. البيئة NumPy 2.3.5 على CPython 3.12.14.

سجلنا الجزأين الحقيقي والتخيلي للناتج على الترتيب: (0.6,0.8)، ثم (−0.8,0.6)، ثم (0,−1)، ثم (0,0). كان نوع y هو complex128 وشكله (4,).

في الأول بقي جزء تخيلي 0.8؛ وفي الثاني بقي 0.6. والثالث له جزء حقيقي صفري، لكن جزءه التخيلي −1. لذلك لا يصف الناتجَ في أمثلتنا اختزاله إلى قيمة حقيقية من المجموعة −1 و0 و1.

عرضنا الأصفار عدديًا بصفر في المقال والصورة. سجل التشغيل الخام يتضمن −0.0 لبعض الأجزاء؛ لم نفحص بتاته ولا نعتمد على اختلاف إشارة الصفر لبناء استنتاج هنا.

غيّر المدخل ثم راجع الحساب

أنشأنا التحكم np.sign(z.real)؛ المدخل هذه المرة الأجزاء الحقيقية 6 و−8 و0 و0 فقط. سجلنا [1.0,-1.0,0.0,0.0] ونوع float64.

العدد −5j أوضح موضع للمقارنة: أعطى الاستدعاء المركب −1j، وأعطى التحكم الحقيقي صفرًا. لا ننسب تحكم الأجزاء الحقيقية إلى الاستدعاء الذي تلقى المتجه المركب كاملًا؛ له مدخل آخر.

نراجع المثال الأول بحساب صحيح: 6²+8²=36+64=100=10². بقسمة الجزأين على 10 نحصل على Fraction(6,10)=3/5 وFraction(8,10)=4/5، أي 0.6 و0.8 في العرض العددي.

للمثال الثاني نجد (−8)²+6²=100 أيضًا؛ الجزآن المرجعيان −4/5 و3/5. مربع المقدار المرجعي في الحالتين 9/25+16/25=1. المرجع كسري دقيق؛ تمثيل الأجزاء العشرية العائمة ليس ادعاءً بتطابق البتات مع الكسور.

وفي الثالث 0²+(−5)²=25=5²؛ الجزآن المرجعيان 0 و−1. أما الصفر فله معالجة منفصلة في المرجع تعطي الجزأين 0 و0؛ لا نقسمه على مقدار صفري.

قارن الفحص أجزاء الناتج بالمراجع ضمن سماح مطلق 1e−15، وراجع مربع المقدار من الأجزاء العائمة ضمن السماح نفسه. حفظنا بايتات المدخل قبل التشغيل وبعده فوجدناها متساوية؛ لم نفحص مشاركة الذاكرة.

استدعاء مركب وتحكم بالأجزاء الحقيقية.
رسم أصلي للتشغيل المسجل.

اعرف ماذا تغطي الشبكة

جربنا جميع أزواج العددين الصحيحين a وb من −12 إلى 12، ثم احتفظنا فقط بمن له مقدار صحيح h. حسبنا n=a*a+b*b وh=math.isqrt(n)، وقبلنا الحالة عندما h*h==n. بهذا الاختيار بقيت 81 حالة، منها الصفر.

لكل حالة غير صفرية كتبنا المرجع بزوج Fraction(a,h) وFraction(b,h)، وللصفر زوجًا من كسرين صفريين. لا يستدعي هذا المرجع np.sign أو np.abs أو abs على عدد مركب أو قسمة مركبة؛ يجري حسابًا صحيحًا وكسريًا للأجزاء.

في كل حالة أربعة فحوص: اتفاق الجزأين مع المرجع ضمن السماح؛ ونوع الناتج complex128 وشكله (1,)؛ ومربع المقدار العائم مقارنة بواحد أو صفر ضمن السماح؛ وثبات بايتات المدخل.

عدد فحوص الشبكة 81×4=324. أضفنا خمسة للمثال الرباعي: جزأي كل خرج، والنوع والشكل، والتحكم الحقيقي وقيمه ونوعه، ومربعات المقادير، وثبات المدخل. الإجمالي 329 ومرت جميعها.

النتائج تخص complex128 ومدخلات صحيحة الأجزاء صغيرة ومحدودة. لم نفحص NaN أو اللانهاية أو القيم الضخمة أو الصغيرة جدًا، ولا الأنواع الأخرى أو المتغيرات المفردة أو خيارات where/out أو بتات الصفر أو الأداء. أمثلتنا مؤلفة، وليست بيانات قياس أو ضمانًا لكل استدعاء.

z / complex128sign(z) / complex128sign(z.real) / float64
6+8j0.6+0.8j1
−8+6j−0.8+0.6j−1
−5j−1j0
0j0j0

للتوسع: الأعداد المركبة.

المراجع

  1. NumPy 2.3 — sign

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.