كيف يمكنني حساب الجذر التربيعي ؟


التعليقات

خوارزمية التقريب

الهدف هو البحث عن الجذر التربيعي ل a بدقة r

وهو حل المعادلة x²-a=0

نعتبر الدالة f(x)=x²-a

وبالتالي البحث عن حل المعادلة f(x)=0

نعتبر المتتاليتان (xn) و (yn)

بحيث

x0=0 ; y0=a

إذا كان

f(xn)*f((xn+yn)/2)<0

فإن

y(n+1)=(xn+yn)/2  ;  x(n+1)=xn

وإلا فإن

x(n+1)=(xn+yn)/2  ;  y(n+1)=yn

المتتاليتان (xn) و (yn) نهايتهما عندما يأول n إلى ما لا نهاية هي حل المعادلة f(x)=0 أي الجذر التربيعي ل a نطبيق هذه الطريقة إبتداءا من n=0 إلى أن نجد

|yn-xn| < r

ملحوظة : إذا كان a>1 نأخد

x0=0 ; y0=a

أما إذا كان a<1 نأخد

x0=0 ; y0=1

ماذا عن

x = 2^ceil(numbits(N)/2)
loop:
    y = floor((x + floor(N/x))/2)

  if y >= x return x x = y

لم أفهم ما كتبت

وهلا شرحت لي ماهي N و numbits

أريد أن أسألك لو سمحت

كيف يمكن معرفة النسبة التي وصل إليها تحميل صفحة html أو صورة أو أي tag عن طريق JavaScript ؟

كيف يمكن معرفة النسبة التي وصل إليها تحميل صفحة html أو صورة أو أي tag عن طريق JavaScript ؟

باستخدام الحدث progress، هذا مثال ملاحظة استعملت بعض خصائص(الدوال السهميّة، المتغير المحليّة) الإصدار السادس من مواصفة ES6، قد لا تعمل على كل المتصفحات:

"use strict";
var req = new XMLHttpRequest();

req.addEventListener("progress", (e) => {
    if (e.lengthComputable) { // الحجم معلوم
        let percet = e.loaded / e.total; // نسبة التحميل
        console.log(percet);
    } 
})

req.open("GET", "

http://url.com ") req.send(null)

آسف للتدخل وتغيير الموضوع:)

لا أقصد أن أستدعي موقعا آخر ب JavaScript

أقصد نفس الصفحة التي أنت تعمل عليها

مثل في youtube عندما تدخل لصفحة يظهر شريط يبين النسبة التي وصل إليها تحميل الصفحة

أو مثلا عندما تدخل لموقع فيظهر لك %0 وتزداد مع تحميل الصفحة إلى أن تصل إلى %100

ثم يظهر لك الموقع مكتمل التحميل

هأنا أكتب الرد للمرة الثالثة متى ستحل مشكلة الرجوع عند الحذف!

إن كنت تقصد معرفة مقدار التحميل بالمقدار فهذا لا يمكن أو سيشبه أن يستحيل فعله؛ لن يمكنك معرفة كم تريد أن تحمل ملفات css، js، الخطوط، الصور...، ستحتاج على الأقل إلى أستلام ترويسة Content-Length، وهذا قد ينتج عنه بعض المشاكل قد تحمل بعض الملفات قبل أن تعرف مساحة الآخرى فلن يكون المحمل صحيحًا، أصلًا إن استطعت أن تراقب الطلبات، أو ستستخدم ajax لتحميل تلك الملفات.

بدلًا من ذلك ستستخدم مراحل تحميل المستند لم يتم البدء، جاري التحميل، تم التحميل، تم الإنتهاء من أغلب الأشياء، تم الإنتهاء، نفِّذ هذه الشيفر بعد تحميل الdocument يجب أن يكون في سياق الhead وأجعل المحمل يتحرك كلما تغيرت الحالة:

"use strict";
document.onreadystatechange = () => {
  switch (document.readyState) {
    case "uninitialized":
      alert("لم يتم البدء");
    case "loading":
      console.log("جاري التحميل");
    case "loaded":
      console.log("تم التحميل جاري إعداد الصفحة");
    case "interactive":
      console.log("تم تحميل أغلب الأشياء");
    case "complete":
      console.log("تم الإنتهاء");
  }
}

ملاحظة صديقي اطلعت على الشيفرة التي كتبتها في الآعلى لما لا تستخدم طريقة تصميم شيفرة JavaScript[1]، ثم المُغير A أراه محلي عرفه بداخل while{} باستخدام let لا حاجة لجعله عام في الدّالّة، أيضًا لماذا تكتب 0.000000000000001، javascript تدعم الكتابة العلمية 1 * 10⁻¹⁵، ليكون كالتالي في JavaScript يساوي 1e-15، أدعواْ الله أن يوفقك.

/*global console*/
function ready() {
    "use strict";
    switch (document.readyState) {
    case "uninitialized":
        console.log("لم يبدأ التحميل بعد");
        break;
    case "loading":
        console.log("جاري التحميل");
        break;
    case "loaded":
        console.log("جاري إعداد الصفحة");
        break;
    case "interactive":
        console.log("تم تحميل أغلب الأشياء");
        break;
    case "complete":
        console.log("تم الإنتهاء");
        break;
    }
}
ready();
document.onreadystatechange = function () {
    "use strict";
    ready();
};

أعدت صياغة الكود حسب ما فهمت أضن أنه يقوم بنفس المهمة لدي أسئلة عن الكود - عندما أشغل الكود يظهر فقط

جاري التحميل
تم تحميل أغلب الأشياء
تم الإنتهاء

هل لأنه مر على المرحلة "جاري إعداد الصفحة" بسرعة لم يظهرها؟

  • كتبت

() => {}

هل لها نفس مهمة function؟


وجزاك الله كل خير أخي :)

جاري التحميل

تم تحميل أغلب الأشياء

تم الإنتهاء

في الحقيقة لا أعلم قد يكون أيضًا يختلف من متصفح إلى آخر.

هل لها نفس مهمة function؟

هذه الدوال السهمية أتت من الإصدار الجديد من مواصفة ES، الذي يسمى ES6 هي دالة لكنها تختلف في السياق الخاصة بها عن function، فهي ترمز دائمًا إلى نفس السياق يكون this كما هو ثابت، بعكس function، مثلًا هذا لن يعمل:

class Caller {
    constructor() {
        this.test = "Worked";
        (function() {
            alert(this.test); // خطأ this يشير إلى شيء آخر أو لا شيء!
        })();
    }
}

new Caller()    

يمكن استخدام bind لتثبيت قيمة this لكنه حل ترقيعي وسيء، باستخدام الدوال السهمية ستعمل لأن قيمة this لا تتغير:

class Caller {
    constructor() {
        this.test = "Worked";
        (() => {
            alert(this.test);
        })();
    }
}

new Caller()

بالطبع لن تحدث مشاكل إن استخدمتها بدلًا من function كسلًا أو استسهالًا كما أفعل:)

بالمناسبة كنت أكتب عن الموضوع في سلسلة تخص typescript وتناسيت نشرها، تذكرت الآن، شكرًا لك.

لم أفهم عليك وضح أكثر !

عندما تدخل لبعض المواقع يظهر لك %0 وتزداد مع تحميل الصفحة إلى أن تصل إلى %100

ثم يظهر لك الموقع مكتمل التحميل

  • كيف يفعلون ذلك؟

اذا كان الأمر كالذي يقوم به يوتيوب مثلا تدخل الموقع فيقوم بعمل progress bar ,, فالكود طويل نوعا ما سأصوره لك من محرري و أبعثه لك كرسالة كما أن هناك العديد من المكتبات التي تسهل عليك الأمر ,,.

  <style>
 #progress {
  position: fixed;
  z-index: 2147483647;
  top: 0;
  left: -6px;
  width: 1%;
  height: 2px;
  background: #0088CC;
  -moz-border-radius: 1px;
  -webkit-border-radius: 1px;
  border-radius: 1px;
  -moz-transition: width 500ms ease-out,opacity 400ms linear;
  -ms-transition: width 500ms ease-out,opacity 400ms linear;
  -o-transition: width 500ms ease-out,opacity 400ms linear;
  -webkit-transition: width 500ms ease-out,opacity 400ms linear;
  transition: width 500ms ease-out,opacity 400ms linear;
  }
  #progress dd, #progress dt {
  position: absolute;
  top: 0;
  height: 2px;
  -moz-box-shadow: #0088CC 1px 0 6px 1px;
  -ms-box-shadow: #0088CC 1px 0 6px 1px;
  -webkit-box-shadow: #0088CC 1px 0 6px 1px;
  box-shadow: #0088CC 1px 0 6px 1px;
  -moz-border-radius: 100%;
  -webkit-border-radius: 100%;
  border-radius: 100%;
  }
  #progress dt {
  opacity: .6;
  width: 180px;
  right: -80px;
  clip: rect(-6px,90px,14px,-6px);
  }
  #progress dd {
  opacity: .6;
  width: 20px;
  right: 0;
  clip: rect(-6px,22px,14px,10px);
  }
  </style>
  <script>
  jQuery(document).ready(function() {
  jQuery("body").append(jQuery("<div><dt/><dd/></div>").attr("id", "progress"));
  jQuery("#progress").width(100+ "%");
  jQuery("#progress").width("101%").delay(800).fadeOut(400, function() {
  jQuery(this).remove();
  });
  });
  </script>

هذا الكود لا يتغير وفقا للنسبة التي وصل إليها تحميل الصفحة

أي لا يعطي النسبة الحقيقية لما وصل إليه التحميل

هو يشتغل بعد تحميل الصفحة

نعم يعمل كاطار يقوم بعمل load بمجرد ظهور الصفحة !! أم عن ماذا تبحث أنت !!

او استعمل هذه المكتبة هي معروفة جدا و الكثير يستعمها ,,,

أو

لا أبحث عن style بل عن سكربت يعطيني القيمة (رقم) التي وصل إليها تحميل الصفحة في لحظات التحميل

أمم سيتطلب الأمر منك بعض البحث ,, لم أتعامل مع هذا من قبل ,, اطرح الأمر في stackoverflow أو في جروب عبد الله عيد ( لا أنصحك بذلك في الحقيقة ) أو ابحث في جوجل لا أعتقد أن جوجل سيبخل عليك بالإجابة

هذا تطبيقي لها قد يساعدك في فهم الخوارزمية

كود JavaScript

function sqrt(a) {

    var u = 0,  /////////////////// u=xn
           v = (a > 1) ? a : 1,      /////////v=yn
           A, ///////////////// (xn+yn)/2
           r = 0.000000000000001;


    /////////////  a هنا نزيل الحالات الخاصة ل
    if (a === 1) {return 1; } else if (a === 0) {return 0; }

    while (Math.abs(v - u) > r) {

    ////// لم يتحقق شرط التوقف



        A = (u + v) / 2;

        if ((A * A - a) * (u * u - a) < 0) {//////// f(A)*f(u)<0
             v = A;
        } else if ((A * A - a) * (u * u - a) > 0) {//////// f(A)*f(u)>0
             u = A;
        } else { //////// f(A)*f(u)=0
             u = v = A;
        }
    }
    return [u, v];
}

هل تقصد أنك تريد عمل برنامج يعطي قيمة مقربة للجذر التربيعي؟

دون إستخدام الدوال الجاهزة

لدي خوارزمية سأعطيك إياها

وجدتها في كتاب الرياضيات

هذه متتالية أخرى أبسط وسريعة الوصول إلى الجذر المربع للعدد a الغير منعدم

U0 = a
U(n+1) = (U(n) + a / U(n)) / 2

مثال

U0 = 2
U1 = (U0 + 2 / U0) / 2 = 3/2
U2 = (U1 + 2 / U1) / 2 = 17/12
U3 = (U2 + 2 / U2) / 2 = 577/408

U4 = (U3 + 2 / U3) / 2 = 1.414213562..

U5 = (U4 + 2 / U4) / 2 = 1.414213562..

U6 = (U5 + 2 / U5) / 2 = 1.414213562..

U7 = (U6 + 2 / U6) / 2 = 1.414213562..

وهذه هي النتيجة التي تقدمها الآلة الحاسبة

sqrt(2) = 1.414213562

وهذه كيفية برمجتها ب JavaScript

function sqrt(a) {
    "use strict";
    if (a < 0) {return false; }
    if (a === 0) {return 0; }
    var U = [a];
    U[1] = (U[0] + a / U[0]) / 2;
    while (U[U.length - 1] !== U[U.length - 2]) {
        U[U.length] = (U[U.length - 1] + a / U[U.length - 1]) / 2;
    }
    return U[U.length - 1];
}

بمعنى أننا نتوقف عندما نجد

U(n+1) = U(n)

اشرحها وكأني في الخامسة

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

65.3 ألف متابع