|
|
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) |
سطر 1: |
سطر 1: |
| تمثل كائنات Float أرقامًا حقيقية غير دقيقة باستخدام تمثيل النقطة العائمة المزدوجة الدقة للبنية الأصلية.
| | <noinclude>{{DISPLAYTITLE: الصنف <code>Float</code> في روبي}}</noinclude> |
| | تمثِّل كائنات الصنف <code>Float</code> أعدادًا حقيقيةً غير دقيقة (inexact real numbers) باستخدام التمثيل العشري ذي الدقة المضاعفة للبنية الأصلية. |
|
| |
|
| للنقطة العائمة حساب مختلف وهو رقم غير دقيق. لذا يجب معرفة نظامها الخاص. انظر التالي:
| | للمنازل العشرية حساب مختلف وهو عدد غير دقيق، لذا يجب معرفة نظامها الخاص. نقترخ عليك الاطلاع على الصفحات التالية: |
|
| |
|
| [[docs.sun.com/source/806-3568/ncg_goldberg.html]] | | * [https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html ما هي الأشياء التي يجب أن يعرفها كل عالم حاسوب عن الأعداد العشرية]. |
|
| |
|
| [[wiki.github.com/rdp/ruby_tutorials_core/ruby-talk-faq#wiki-floats_imprecise]] | | * [https://github.com/rdp/ruby_tutorials_core/wiki/ruby-talk-faq#floats_imprecise لماذا الأعداد العشرية في روبي غير دقيقة؟] |
|
| |
|
| [[en.wikipedia.org/wiki/Floating_point#Accuracy_problems]] | | * [[wikipedia:Floating-point_arithmetic#Accuracy_problems|مشاكل في الدقة]]. |
| ===الثوابت===
| | ==الثوابت== |
| ====<code>DIG</code>====
| | ===<code>DIG</code>=== |
| الحد الأدنى لعدد الأرقام العشرية ذات الدلالة في النقطة العائمة المزدوجة الدقة. | | الحد الأدنى لعدد الأرقام العشرية ذات الدلالة في المنازل العشرية المزدوجة الدقة. وعادةً ما تكون قيمته الافتراضية <code>15</code>. |
| | ===<code>EPSILON</code>=== |
| | الفرق بين <code>1</code> و أصغر عدد عشري ذي دقة مضاعفة أكبر من <code>1</code> من نوع النقطة العائمة المزدوجة الدقة. وعادة ما تكون قيمته الافتراضية هي <code>2.2204460492503131e-16</code>. |
| | ===<code>INFINITY</code>=== |
| | يمثل اللانهاية الموجبة. |
| | ===<code>MANT_DIG</code>=== |
| | عدد الأرقام الأساسية للأعداد العشرية المضاعفة (أي البيانات ذات النوع double). وعادةً ما تكون قيمته الافتراضية هي <code>53</code>. |
| | ===<code>MAX</code>=== |
| | أكبر عدد صحيح في العدد العشري ذي الدقة المضاعفة. وعادةً ما تكون قيمته الافتراضية <code>1.7976931348623157e+308</code>. |
| | ===<code>MAX_10_EXP</code>=== |
| | أكبر أس موجب في العدد العشري ذي الدقة المضاعفة حيث تكون القيمة <code>10</code> مرفوعة إلى هذا الأس بعد طرح القيمة <code>1</code> منها. وعادةً ما تكون قيمته الافتراضية هي <code>308</code>. |
| | ===<code>MAX_EXP</code>=== |
| | أكبر قيمة أس محتملة في العدد العشري ذي الدقة المضاعفة. وعادةً ما تكون قيمته الافتراضية هي <code>1024</code>. |
| | ===<code>MIN</code>=== |
| | أصغر رقم طبيعي ([[wikipedia:Normalized_number|normalized number]]) موجب في العدد العشري ذي الدقة المضاعفة. وعادة ما تكون قيمته الافتراضية <code>2.2250738585072014e-308</code>. |
|
| |
|
| وعادة ما تكون قيمته الافتراضية <code>15</code>.
| | إذا كانت المنصة تدعم الأعداد غير الطبيعية ([[wikipedia:Denormal_number|denormalized numbers]])، فسيكون هناك أرقام بين الصفر والقيمة <code>Float::MIN</code>. وتعيد <code>0.0.next_float</code> أصغر عدد عشري موجب بما في ذلك الأعداد غير الطبيعية ([[wikipedia:Denormal_number|denormalized numbers]]). |
| ====<code>EPSILON</code>====
| | ===<code>MIN_10_EXP</code>=== |
| الفرق بين <code>1</code> و أصغر عدد أكبر من <code>1</code> من نوع النقطة العائمة المزدوجة الدقة.
| | أصغر أس سالب في العدد العشري ذي الدقة المضاعفة إذ تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>. وعادةً ما تكون قيمته الافتراضية <code>-307</code>. |
| | | ===<code>MIN_EXP</code>=== |
| وعادة ما تكون قيمته الافتراضية <code>2.2204460492503131e-16</code>.
| | أصغر قيمة أس محتملة في العدد العشري ذي الدقة المضاعفة. وعادةً ما تكون قيمته الافتراضية <code>-1021</code>. |
| ====<code>INFINITY</code>====
| | ===<code>NAN</code>=== |
| تعبير يمثل اللانهاية الموجبة.
| |
| ====<code>MANT_DIG</code>====
| |
| عدد الأرقام الأساسية لنوع البيانات المزدوج (double).
| |
| | |
| وعادة ما تكون قيمته الافتراضية <code>53</code>.
| |
| ====<code>MAX</code>====
| |
| أكبر عدد صحيح في النقطة العائمة المزدوجة الدقة.
| |
| | |
| وعادة ما تكون قيمته الافتراضية <code>1.7976931348623157e+308</code>.
| |
| ====<code>MAX_10_EXP</code>====
| |
| أكبر أس موجب في النقطة العائمة المزدوجة الدقة حيث تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>.
| |
| | |
| وعادة ما تكون قيمته الافتراضية <code>308</code>.
| |
| ====<code>MAX_EXP</code>====
| |
| أكبر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة.
| |
| | |
| وعادة ما تكون قيمته الافتراضية <code>1024</code>.
| |
| ====<code>MIN</code>====
| |
| أصغر رقم مُعيَّر موجب في النقطة العائمة المزدوجة الدقة.
| |
| | |
| وعادة ما تكون قيمته الافتراضية <code>2.2250738585072014e-308</code>.
| |
| | |
| إذا كانت المنصة تدعم الأرقام غير المُعيَّرة، يكون هناك أرقام بين صفر و <code>Float::MIN</code>. وتعيد <code>0.0.next_float</code> أصغر نقطة عائمة موجبة بما في ذلك الأرقام غير المُعيَّرة. | |
| ====<code>MIN_10_EXP</code>====
| |
| أصغر أس سالب في النقطة العائمة المزدوجة الدقة حيث تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>. | |
| | |
| وعادة ما تكون قيمته الافتراضية <code>-307</code>.
| |
| ====<code>MIN_EXP</code>====
| |
| أصغر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة. | |
| | |
| وعادة ما تكون قيمته الافتراضية <code>-1021</code>.
| |
| ====<code>NAN</code>====
| |
| تعبير يمثل القيمة "ليست عددًا" (not a number). | | تعبير يمثل القيمة "ليست عددًا" (not a number). |
| ====<code>RADIX</code>====
| | ===<code>RADIX</code>=== |
| أساس النقطة العائمة، أو عدد الأرقام الفريدة المستخدمة لتمثيل الرقم. | | أساس العدد العشري، أو عدد الأرقام الفريدة المستخدمة لتمثيل العدد. وعادةً ما تكون قيمته الافتراضية <code>2</code> على معظم الأنظمة، والتي تمثل النظام العشري ذي الأساس <code>10</code>. |
| | | ===<code>ROUNDS</code>=== |
| وعادة ما تكون قيمته الافتراضية <code>2</code> على معظم الأنظمة، والتي تمثل النظام العشري للأساس <code>10</code>.
| | يمثل وضع التقريب لإضافة المنازل العشرية. وعادةً ما تكون قيمته الافتراضية <code>1</code>، التقريب إلى أقرب عدد. |
| ====<code>ROUNDS</code>====
| |
| يمثل وضع التقريب لإضافة النقطة العائمة. | |
| | |
| وعادة ما تكون قيمته الافتراضية <code>1</code>، التقريب إلى أقرب عدد.
| |
|
| |
|
| وتشمل الأوضاع الأخرى: | | وتشمل الأوضاع الأخرى: |
| | * <code>-1</code>: مُتعذِّر تحديده. |
|
| |
|
| <code>-1</code> : مُتعذِّر تحديده.
| | * <code>0</code>: التقريب نحو الصفر. |
| | |
| <code>0</code> : التقريب نحو الصفر. | |
| | |
| <code>1</code> : التقريب إلى أقرب عدد.
| |
| | |
| <code>2</code> : التقريب نحو اللانهاية الموجبة.
| |
| | |
| <code>3</code> : التقريب نحو اللانهاية السالبة.
| |
| ===توابع المثيل العام===
| |
| ====<code>float % other → float</code>====
| |
| إعادة الوحدة بعد قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
| |
| 6543.21.modulo(137) #=> 104.21000000000004
| |
| 6543.21.modulo(137.24) #=> 92.92999999999961
| |
| | |
| </syntaxhighlight><syntaxhighlight lang="ruby">
| |
| static VALUE
| |
| flo_mod(VALUE x, VALUE y)
| |
| {
| |
| double fy;
| |
| | |
| if (RB_TYPE_P(y, T_FIXNUM)) {
| |
| fy = (double)FIX2LONG(y);
| |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| fy = rb_big2dbl(y);
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| fy = RFLOAT_VALUE(y);
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, '%');
| |
| }
| |
| return DBL2NUM(ruby_float_mod(RFLOAT_VALUE(x), fy));
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float * other → float</code>====
| |
| إعادة Float جديد والذي يكون هو نتاج حاصل ضرب <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| flo_mul(VALUE x, VALUE y)
| |
| {
| |
| if (RB_TYPE_P(y, T_FIXNUM)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) * (double)FIX2LONG(y));
| |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) * rb_big2dbl(y));
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) * RFLOAT_VALUE(y));
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, '*');
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>float ** other → float</code>====
| |
| رفع <code>float</code> للأس <code>other</code>.<syntaxhighlight lang="ruby">
| |
| 2.0**3 #=> 8.0
| |
| | |
| </syntaxhighlight><syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_float_pow(VALUE x, VALUE y)
| |
| {
| |
| double dx, dy;
| |
| if (RB_TYPE_P(y, T_FIXNUM)) {
| |
| dx = RFLOAT_VALUE(x);
| |
| dy = (double)FIX2LONG(y);
| |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| dx = RFLOAT_VALUE(x);
| |
| dy = rb_big2dbl(y);
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| dx = RFLOAT_VALUE(x);
| |
| dy = RFLOAT_VALUE(y);
| |
| if (dx < 0 && dy != round(dy))
| |
| return num_funcall1(rb_complex_raw1(x), idPow, y);
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, idPow);
| |
| }
| |
| return DBL2NUM(pow(dx, dy));
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float + other → float</code>====
| |
| إعادة Float جديد والذي يكون هو نتاج حاصل جمع <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| flo_plus(VALUE x, VALUE y)
| |
| {
| |
| if (RB_TYPE_P(y, T_FIXNUM)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) + (double)FIX2LONG(y));
| |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) + rb_big2dbl(y));
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) + RFLOAT_VALUE(y));
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, '+');
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>float - other → float</code>====
| |
| إعادة Float جديد والذي يكون هو الفرق بين <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| flo_minus(VALUE x, VALUE y)
| |
| {
| |
| if (RB_TYPE_P(y, T_FIXNUM)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) - (double)FIX2LONG(y));
| |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) - rb_big2dbl(y));
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) - RFLOAT_VALUE(y));
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, '-');
| |
| }
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>-float → float</code>====
| |
| إعادة <code>float</code> بعلامة سالبة.<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_float_uminus(VALUE flt)
| |
| {
| |
| return DBL2NUM(-RFLOAT_VALUE(flt));
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float / other → float</code>====
| |
| إعادة Float جديد والذي يكون نتاج حاصل قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| flo_div(VALUE x, VALUE y)
| |
| {
| |
| long f_y;
| |
| double d;
| |
| | |
| if (RB_TYPE_P(y, T_FIXNUM)) {
| |
| f_y = FIX2LONG(y);
| |
| return DBL2NUM(RFLOAT_VALUE(x) / (double)f_y);
| |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| d = rb_big2dbl(y);
| |
| return DBL2NUM(RFLOAT_VALUE(x) / d);
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| return DBL2NUM(RFLOAT_VALUE(x) / RFLOAT_VALUE(y));
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, '/');
| |
| }
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>float < real → true or false</code>====
| |
| إعادة <code>true</code> إذا كان <code>float</code> أقل من <code>real</code>.
| |
| | |
| نتيجة NaN < NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد على التنفيذ.<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| flo_lt(VALUE x, VALUE y)
| |
| {
| |
| double a, b;
| |
| | |
| a = RFLOAT_VALUE(x);
| |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| VALUE rel = rb_integer_float_cmp(y, x);
| |
| if (FIXNUM_P(rel))
| |
| return -FIX2INT(rel) < 0 ? Qtrue : Qfalse;
| |
| return Qfalse;
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(b)) return Qfalse;
| |
| #endif
| |
| }
| |
| else {
| |
| return rb_num_coerce_relop(x, y, '<');
| |
| }
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a)) return Qfalse;
| |
| #endif
| |
| return (a < b)?Qtrue:Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float <= real → true or false</code>====
| |
| إعادة <code>true</code> إذا كان <code>float</code> أقل من أو يساوي <code>real</code>.
| |
| | |
| نتيجة NaN <= NaN غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| flo_le(VALUE x, VALUE y)
| |
| {
| |
| double a, b;
| |
| | |
| a = RFLOAT_VALUE(x);
| |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| VALUE rel = rb_integer_float_cmp(y, x);
| |
| if (FIXNUM_P(rel))
| |
| return -FIX2INT(rel) <= 0 ? Qtrue : Qfalse;
| |
| return Qfalse;
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(b)) return Qfalse;
| |
| #endif
| |
| }
| |
| else {
| |
| return rb_num_coerce_relop(x, y, idLE);
| |
| }
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a)) return Qfalse;
| |
| #endif
| |
| return (a <= b)?Qtrue:Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float <=> real → -1, 0, +1, or nil</code>====
| |
| إعادة -1 ، 0 أو +1 اعتمادًا على ما إذا كان <code>float</code> أقل من أو يساوي أو أكبر من <code>real</code>. هذا هو أساس الاختبارات في وحدة [[Ruby/Comparable|Comparable]].
| |
| | |
| نتيجة NaN <=> NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.
| |
| | |
| إعادة <code>nil</code> إذا كانت القيمتين غير صالحتين للمقارنة.<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| flo_cmp(VALUE x, VALUE y)
| |
| {
| |
| double a, b;
| |
| VALUE i;
| |
| | |
| a = RFLOAT_VALUE(x);
| |
| if (isnan(a)) return Qnil;
| |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| VALUE rel = rb_integer_float_cmp(y, x);
| |
| if (FIXNUM_P(rel))
| |
| return INT2FIX(-FIX2INT(rel));
| |
| return rel;
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| }
| |
| else {
| |
| if (isinf(a) && (i = rb_check_funcall(y, rb_intern("infinite?"), 0, 0)) != Qundef) {
| |
| if (RTEST(i)) {
| |
| int j = rb_cmpint(i, x, y);
| |
| j = (a > 0.0) ? (j > 0 ? 0 : +1) : (j < 0 ? 0 : -1);
| |
| return INT2FIX(j);
| |
| }
| |
| if (a > 0.0) return INT2FIX(1);
| |
| return INT2FIX(-1);
| |
| }
| |
| return rb_num_coerce_cmp(x, y, id_cmp);
| |
| }
| |
| return rb_dbl_cmp(a, b);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float == obj → true or false</code>====
| |
| إعادة <code>true</code> فقط إذا كانت قيمة <code>obj</code> نفس قيمة <code>float</code>. علي عكس ذلك تحتاج <code>#eql?</code> أن يكون <code>obj</code> من النوع Float.<syntaxhighlight lang="ruby">
| |
| 1.0 == 1 #=> true
| |
| | |
| </syntaxhighlight>نتيجة NaN == NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_float_equal(VALUE x, VALUE y)
| |
| {
| |
| volatile double a, b;
| |
| | |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| return rb_integer_float_eq(y, x);
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(b)) return Qfalse;
| |
| #endif
| |
| }
| |
| else {
| |
| return num_equal(x, y);
| |
| }
| |
| a = RFLOAT_VALUE(x);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a)) return Qfalse;
| |
| #endif
| |
| return (a == b)?Qtrue:Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>float == obj → true or false</code>====
| |
| إعادة <code>true</code> فقط إذا كانت قيمة <code>obj</code> نفس قيمة <code>float</code>. علي عكس ذلك تحتاج <code>#eql?</code> أن يكون <code>obj</code> من نوع Float.
| |
| | |
| نتيجة NaN == NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.<syntaxhighlight lang="ruby">
| |
| VALUE
| |
| rb_float_equal(VALUE x, VALUE y)
| |
| {
| |
| volatile double a, b;
| |
| | |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| return rb_integer_float_eq(y, x);
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(b)) return Qfalse;
| |
| #endif
| |
| }
| |
| else {
| |
| return num_equal(x, y);
| |
| }
| |
| a = RFLOAT_VALUE(x);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a)) return Qfalse;
| |
| #endif
| |
| return (a == b)?Qtrue:Qfalse;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>float > real → true or false</code>====
| |
| إعادة <code>true</code> إذا كان <code>float</code> أكبر من <code>real</code>.
| |
| | |
| نتيجة NaN > NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_float_gt(VALUE x, VALUE y)
| |
| {
| |
| double a, b;
| |
| | |
| a = RFLOAT_VALUE(x);
| |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| VALUE rel = rb_integer_float_cmp(y, x);
| |
| if (FIXNUM_P(rel))
| |
| return -FIX2INT(rel) > 0 ? Qtrue : Qfalse;
| |
| return Qfalse;
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(b)) return Qfalse;
| |
| #endif
| |
| }
| |
| else {
| |
| return rb_num_coerce_relop(x, y, '>');
| |
| }
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a)) return Qfalse;
| |
| #endif
| |
| return (a > b)?Qtrue:Qfalse;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>float >= real → true or false</code>====
| |
| إعادة <code>true</code> إذا كان <code>float</code> أكبر من أو يساوي <code>real</code>.
| |
| | |
| نتيجة NaN >= NaN غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| flo_ge(VALUE x, VALUE y)
| |
| {
| |
| double a, b;
| |
| | |
| a = RFLOAT_VALUE(x);
| |
| if (RB_TYPE_P(y, T_FIXNUM) || RB_TYPE_P(y, T_BIGNUM)) {
| |
| VALUE rel = rb_integer_float_cmp(y, x);
| |
| if (FIXNUM_P(rel))
| |
| return -FIX2INT(rel) >= 0 ? Qtrue : Qfalse;
| |
| return Qfalse;
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(b)) return Qfalse;
| |
| #endif
| |
| }
| |
| else {
| |
| return rb_num_coerce_relop(x, y, idGE);
| |
| }
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a)) return Qfalse;
| |
| #endif
| |
| return (a >= b)?Qtrue:Qfalse;
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>abs → float</code>====
| |
| إعادة القيمة المطلقة للتابع <code>float</code>.<syntaxhighlight lang="ruby">
| |
| (-34.56).abs #=> 34.56
| |
| -34.56.abs #=> 34.56
| |
| 34.56.abs #=> 34.56
| |
| </syntaxhighlight><code><nowiki>#</nowiki>magnitude</code> اسم مستعار للتابع <code>#abs</code>.<syntaxhighlight lang="ruby">
| |
|
| |
| VALUE
| |
| rb_float_abs(VALUE flt)
| |
| {
| |
| double val = fabs(RFLOAT_VALUE(flt));
| |
| return DBL2NUM(val);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>angle → 0 or float</code>====
| |
| إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| float_arg(VALUE self)
| |
| {
| |
| if (isnan(RFLOAT_VALUE(self)))
| |
| return self;
| |
| if (f_tpositive_p(self))
| |
| return INT2FIX(0);
| |
| return rb_const_get(rb_mMath, id_PI);
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>arg → 0 or float</code>====
| |
| إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.<syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| float_arg(VALUE self)
| |
| {
| |
| if (isnan(RFLOAT_VALUE(self)))
| |
| return self;
| |
| if (f_tpositive_p(self))
| |
| return INT2FIX(0);
| |
| return rb_const_get(rb_mMath, id_PI);
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>ceil([ndigits]) → integer or float</code>====
| |
| إعادة أصغر رقم أكبر من أو يساوي <code>float</code> مع دقة <code>ndigits</code> رقم (القيمة الافتراضية: 0).
| |
| | |
| عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره <code>ndigits.abs</code> على الأقل.
| |
| | |
| إعادة رقم نقطة عائمة عندما يكون <code>ndigits</code> موجبًا، وإلا يُعاد عددٌ صحيحٌ.<syntaxhighlight lang="ruby">
| |
| 1.2.ceil #=> 2
| |
| 2.0.ceil #=> 2
| |
| (-1.2).ceil #=> -1
| |
| (-2.0).ceil #=> -2
| |
| | |
| 1.234567.ceil(2) #=> 1.24
| |
| 1.234567.ceil(3) #=> 1.235
| |
| 1.234567.ceil(4) #=> 1.2346
| |
| 1.234567.ceil(5) #=> 1.23457
| |
| | |
| 34567.89.ceil(-5) #=> 100000
| |
| 34567.89.ceil(-4) #=> 40000
| |
| 34567.89.ceil(-3) #=> 35000
| |
| 34567.89.ceil(-2) #=> 34600
| |
| 34567.89.ceil(-1) #=> 34570
| |
| 34567.89.ceil(0) #=> 34568
| |
| 34567.89.ceil(1) #=> 34567.9
| |
| 34567.89.ceil(2) #=> 34567.89
| |
| 34567.89.ceil(3) #=> 34567.89
| |
| </syntaxhighlight>يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:<syntaxhighlight lang="ruby">
| |
| (2.1 / 0.7).ceil #=> 4 (!)
| |
| | |
| </syntaxhighlight>
| |
| ====<code>coerce(numeric) → array</code>====
| |
| إعادة مصفوفة يتمثَّل فيها كلٌ من <code>numeric</code> و <code>float</code> ككائنات Float.
| |
| | |
| ويتحقق ذلك عن طريق تحويل numeric إلى Float.<syntaxhighlight lang="ruby">
| |
| 1.2.coerce(3) #=> [3.0, 1.2]
| |
| 2.5.coerce(1.1) #=> [1.1, 2.5]
| |
| </syntaxhighlight>
| |
| ====<code>denominator → integer</code>====
| |
| إعادة المقام (موجب دائمًا). والنتيجة تعتمد على الآلة.
| |
| | |
| انظر أيضا <code>#numerator</code>.<syntaxhighlight lang="ruby">
| |
| | |
| static VALUE
| |
| float_denominator(VALUE self)
| |
| {
| |
| double d = RFLOAT_VALUE(self);
| |
| VALUE r;
| |
| if (isinf(d) || isnan(d))
| |
| return INT2FIX(1);
| |
| r = float_to_r(self);
| |
| if (canonicalization && k_integer_p(r)) {
| |
| return ONE;
| |
| }
| |
| return nurat_denominator(r);
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>divmod(numeric) → array</code>====
| |
| راجع <code>Numeric#divmod</code>.<syntaxhighlight lang="ruby">
| |
| 42.0.divmod(6) #=> [7, 0.0]
| |
| 42.0.divmod(5) #=> [8, 2.0]
| |
| </syntaxhighlight>
| |
| ====<code>eql?(obj) → true or false</code>====
| |
| إعادة <code>true</code> فقط إذا كانت <code>obj</code> من النوع Float وله نفس قيمة <code>float</code>. علي النقيض من ذلك مع <code>Float#==</code>، الذي يُجري تحويلات على النوع.<syntaxhighlight lang="ruby">
| |
| 1.0.eql?(1) #=> false
| |
|
| |
|
| </syntaxhighlight>نتيجة NaN.eql?(NaN) غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.<syntaxhighlight lang="ruby"> | | * <code>1</code>: التقريب إلى أقرب عدد. |
|
| |
|
| VALUE
| | * <code>2</code>: التقريب نحو اللانهاية الموجبة. |
| rb_float_eql(VALUE x, VALUE y)
| |
| {
| |
| if (RB_TYPE_P(y, T_FLOAT)) {
| |
| double a = RFLOAT_VALUE(x);
| |
| double b = RFLOAT_VALUE(y);
| |
| #if defined(_MSC_VER) && _MSC_VER < 1300
| |
| if (isnan(a) || isnan(b)) return Qfalse;
| |
| #endif
| |
| if (a == b)
| |
| return Qtrue;
| |
| }
| |
| return Qfalse;
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>fdiv(numeric) → float</code>====
| |
| إعادة <code>float / numeric</code>، مثل <code>Float#/</code>.<syntaxhighlight lang="ruby">
| |
|
| |
|
| static VALUE
| | * <code>3</code>: التقريب نحو اللانهاية السالبة. |
| flo_quo(VALUE x, VALUE y)
| |
| {
| |
| return num_funcall1(x, '/', y);
| |
| }
| |
|
| |
| </syntaxhighlight>
| |
| ====<code>finite? → true or false</code>====
| |
| إعادة <code>true</code> إذا كان <code>float</code> عدد نقطة عائمة IEEE صالح، أي أنه ليس لا نهائي و <code>#nan?</code> قيمتها <code>false</code>.<syntaxhighlight lang="ruby">
| |
|
| |
|
| VALUE
| | =توابع النسخة العامة= |
| rb_flo_is_finite_p(VALUE num)
| | ===<code>[[Ruby/Float/mod|%]]</code>=== |
| {
| | يعيد باقي عملية قسمة عدد عشري على عدد آخر. |
| double value = RFLOAT_VALUE(num);
| |
|
| |
|
| #ifdef HAVE_ISFINITE
| | ===<code>[[Ruby/Float/multiplication|*]]</code>=== |
| if (!isfinite(value))
| | يعيد ناتج عملية ضرب عدد عشري بعدد آخر. |
| return Qfalse;
| |
| #else
| |
| if (isinf(value) || isnan(value))
| |
| return Qfalse;
| |
| #endif
| |
|
| |
|
| return Qtrue;
| | ===<code>[[Ruby/Float/expo|**]]</code>=== |
| }
| | يعيد ناتج عملية رفع عدد عشري (الأساس) إلى قوة عدد محدد (الأس). |
|
| |
| </syntaxhighlight>
| |
| ====<code>floor([ndigits]) → integer or float</code>====
| |
| إعادة أكبر رقم أصغر من أو يساوي <code>float</code> مع دقة <code>ndigits</code> رقم عشري (القيمة الافتراضية: 0).
| |
|
| |
|
| عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره <code>ndigits.abs</code> على الأقل.
| | ===<code>[[Ruby/Float/plus|+]]</code>=== |
| | يعيد ناتج عملية الجمع بين عددين. |
|
| |
|
| إعادة رقم نقطة عائمة عندما يكون <code>ndigits</code> موجبًا، وإلا يُعاد عددٌ صحيحٌ.<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Float/minus|-]]</code>=== |
| 1.2.floor #=> 1
| | يعيد ناتج عملية الطرح بين عددين. |
| 2.0.floor #=> 2
| |
| (-1.2).floor #=> -2
| |
| (-2.0).floor #=> -2
| |
|
| |
|
| 1.234567.floor(2) #=> 1.23
| | ===<code>[[Ruby/Float/negation|-]]</code>=== |
| 1.234567.floor(3) #=> 1.234
| | إن استُعمِل هذا المعامل بالشكل <code>-Float</code>، فسيعيد القيمة المعاكسة للعدد <code>Float</code> العشري (أي القيمة السالبة إن كان <code>Float</code> موجبًا أو العكس بالعكس). |
| 1.234567.floor(4) #=> 1.2345
| |
| 1.234567.floor(5) #=> 1.23456
| |
|
| |
|
| 34567.89.floor(-5) #=> 0
| | ===<code>[[Ruby/Float/division|/]]</code>=== |
| 34567.89.floor(-4) #=> 30000
| | يعيد ناتج عملية القسمة بين عدد عشري وعدد آخر. |
| 34567.89.floor(-3) #=> 34000
| |
| 34567.89.floor(-2) #=> 34500
| |
| 34567.89.floor(-1) #=> 34560
| |
| 34567.89.floor(0) #=> 34567
| |
| 34567.89.floor(1) #=> 34567.8
| |
| 34567.89.floor(2) #=> 34567.89
| |
| 34567.89.floor(3) #=> 34567.89
| |
| </syntaxhighlight>يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:<syntaxhighlight lang="ruby">
| |
| (0.3 / 0.1).floor #=> 2 (!)
| |
|
| |
|
| </syntaxhighlight>
| | ===<code>[[Ruby/Float/lt|>]]</code>=== |
| ====<code>hash → integer</code>====
| | يعيد القيمة <code>true</code> إن كانت قيمة العدد العشري الواقع على يساره أصغر من قيمة العدد المواقع على يمينه. |
| إعادة رمز التجزئة لهذا الرقم العشري.
| |
|
| |
|
| راجع أيضًا <code>Object#hash</code>.<syntaxhighlight lang="ruby">
| | ===<code>[[Ruby/Float/le|=>]]</code>=== |
|
| | يعيد القيمة <code>true</code> إن كانت قيمة العدد العشري الواقع على يساره أصغر من أو تساوي قيمة العدد الواقع على يمينه. |
| static VALUE
| |
| flo_hash(VALUE num)
| |
| {
| |
| return rb_dbl_hash(RFLOAT_VALUE(num));
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>infinite? → -1, 1, or nil</code>====
| |
| إعادة <code>nil</code> أو -1، أو 1 اعتمادًا علي ما إذا كانت القيمة محدودة، أو <code>-Infinity</code>، أو <code>+Infinity</code>.<syntaxhighlight lang="ruby">
| |
| (0.0).infinite? #=> nil
| |
| (-1.0/0.0).infinite? #=> -1
| |
| (+1.0/0.0).infinite? #=> 1
| |
| </syntaxhighlight>
| |
| ====<code>inspect()</code>====
| |
| اسم المستعار لـ <code>to_s</code>
| |
| ====<code>magnitude → float</code>====
| |
| إعادة القيمة المطلقة للتابع <code>float</code>.<syntaxhighlight lang="ruby">
| |
| (-34.56).abs #=> 34.56
| |
| -34.56.abs #=> 34.56
| |
| 34.56.abs #=> 34.56
| |
| </syntaxhighlight><code><nowiki>#</nowiki>magnitude</code> اسم مستعار للتابع <code>#abs</code>.<syntaxhighlight lang="ruby">
| |
|
| |
|
| VALUE
| | ===<code>[[Ruby/Float/comparison|<=>]]</code>=== |
| rb_float_abs(VALUE flt)
| | يعيد عددًا صحيحًا (-1 أو 0 أو +1) إذا كان العدد العشري الواقع على يساره أصغر من أو يساوي أو أكبر من العدد الآخر الواقع على يمينه على التوالي. |
| {
| |
| double val = fabs(RFLOAT_VALUE(flt));
| |
| return DBL2NUM(val);
| |
| }
| |
| </syntaxhighlight>
| |
| ====<code>modulo(other) → float</code>====
| |
| إعادة الوحدة بعد قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
| |
| 6543.21.modulo(137) #=> 104.21000000000004
| |
| 6543.21.modulo(137.24) #=> 92.92999999999961
| |
| </syntaxhighlight><syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| flo_mod(VALUE x, VALUE y)
| |
| {
| |
| double fy;
| |
|
| |
|
| if (RB_TYPE_P(y, T_FIXNUM)) {
| | ===<code>[[Ruby/Float/equal|==]]</code>=== |
| fy = (double)FIX2LONG(y);
| | يعيد القيمة <code>true</code> إن كان العدد العشري الواقع على يساره يساوي القيمة الواقعة على يمينه. |
| }
| |
| else if (RB_TYPE_P(y, T_BIGNUM)) {
| |
| fy = rb_big2dbl(y);
| |
| }
| |
| else if (RB_TYPE_P(y, T_FLOAT)) {
| |
| fy = RFLOAT_VALUE(y);
| |
| }
| |
| else {
| |
| return rb_num_coerce_bin(x, y, '%');
| |
| }
| |
| return DBL2NUM(ruby_float_mod(RFLOAT_VALUE(x), fy));
| |
| }
| |
| </syntaxhighlight> | |
|
| |
|
| ====<code>nan? → true or false</code>====
| | ===<code>[[Ruby/Float/gt|<]]</code>=== |
| إعادة <code>true</code> إذا كان <code>float</code> عدد نقطة عائمة IEEE غير صالح.<syntaxhighlight lang="ruby">
| | يعيد القيمة <code>true</code> إن كانت قيمة العدد العشري الواقع على يساره أكبر من قيمة العدد الآخر الواقع على يمينه. |
| a = -1.0 #=> -1.0
| |
| a.nan? #=> false
| |
| a = 0.0/0.0 #=> NaN
| |
| a.nan? #=> true
| |
| </syntaxhighlight><syntaxhighlight lang="ruby">
| |
|
| |
| static VALUE
| |
| flo_is_nan_p(VALUE num)
| |
| {
| |
| double value = RFLOAT_VALUE(num);
| |
|
| |
|
| return isnan(value) ? Qtrue : Qfalse;
| | ===<code>[[Ruby/Float/ge|=<]]</code>=== |
| }
| | يعيد القيمة <code>true</code> إن كانت قيمة العدد العشري الواقع على يساره أكبر من أو تساوي قيمة العدد الآخر الواقع على يمينه. |
|
| |
| </syntaxhighlight> | |
|
| |
|
| ====<code>empty? → true or false</code>====
| | ===<code>[[Ruby/Float/abs|abs]]</code>=== |
| إعادة <code>true</code> إذا كان <code>float</code> أقل من 0.
| | يعيد القيمة المطلقة للعدد العشري الذي استُدعي معه. |
| ====<code>next_float → float</code>====
| |
| إعادة عدد النقطة العائمة القابل للتمثيل التالي.
| |
|
| |
|
| Float::MAX.next_float و Float::INFINITY.next_float هما Float::INFINITY. | | ===<code>[[Ruby/Float/angle|angle]]</code>=== |
| | يعيد القيمة <code>0</code> إن كان العدد العشري الذي استُدعي معه موجبًا، أو القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك. |
|
| |
|
| Float::NAN.next_float هو Float::NAN. | | ===<code>[[Ruby/Float/arg|arg]]</code>=== |
| | يعيد القيمة <code>0</code> إن كان العدد العشري الذي استُدعي معه موجبًا، أو القيمة <code>[[Ruby/Math/PI|pi]]</code> خلاف ذلك. |
|
| |
|
| فعلى سبيل المثال:
| | ===<code>[[Ruby/Float/ceil|ceil]]</code>=== |
| ====<code>numerator → integer</code>====
| | يعيد أصغر عدد من الأعداد الأكبر من أو تساوي العدد العشري الذي استُدعي معه وبدقة محدَّدة. |
| إعادة البسط. والنتيجة تعتمد على الآلة.
| |
|
| |
|
| انظر أيضا #denominator.
| | ===<code>[[Ruby/Float/coerce|coerce]]</code>=== |
| ====<code>phase → 0 or float</code>====
| | يحول العدد المستدعى معها والعدد العشري المُمرَّر إليها إلى النوع <code>[[Ruby/Float|Float]]</code> ويعيدهما في مصفوفة. |
| إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.
| |
| ====<code>positive? → true or false</code>====
| |
| إعادة true إذا كان float أكبر من 0.
| |
| ====<code>prev_float → float</code>====
| |
| إعادة عدد النقطة العائمة القابل للتمثيل السابق.
| |
|
| |
|
| (-Float::MAX).prev_float و (-Float::INFINITY).prev_float هما -Float::INFINITY.
| | ===<code>[[Ruby/Float/denominator|denominator]]</code>=== |
| | يعيد المقام (denominator) للعدد الكسري الذي استدعي معه، ويكون دائمًا موجبًا. |
|
| |
|
| Float::NAN.prev_float هو Float::NAN. | | ===<code>[[Ruby/Float/divmod|divmod]]</code>=== |
| | يعيد مصفوفة تحتوي على حاصل (quotient) وباقي قسمة العدد الذي استُدعي معه على العدد المُمرَّر إليه. |
|
| |
|
| فعلى سبيل المثال:
| | ===<code>[[Ruby/Float/eql-3F|eql?]]</code>=== |
| ====<code>quo(numeric) → float</code>====
| | يتحقق إن كان العدد الذي استُدعي معه والعدد المُمرَّر إليه من نفس النوع (أي كلاهما عدد عشري) ومتساويين في القيمة. |
| إعادة float / numeric، مثل Float#/.
| |
| ====<code>rationalize([eps]) → rational</code>====
| |
| إعادة تقريب ابسط للقيمة (flt-|eps| <= result <= flt+|eps|). إذا لم يتاح الوسيط الاختياري eps، سيُختار تلقائيًا.
| |
|
| |
|
| انظر أيضا #to_r.
| | ===<code>[[Ruby/Float/fdiv|fdiv]]</code>=== |
| ====<code>round([ndigits] [, half: mode]) → integer or float</code>====
| | يجري عملية القسمة بين العدد الذي استدعي معه والعدد الذي مُرِّر إليه ثم يعيد الناتج في عدد <nowiki/>[[Ruby/Float|عشري]]. |
| إعادة float مُقرَّب إلى أقرب قيمة بدقة أرقام عشرية مقدارها ndigits (القيمة الافتراضية: 0).
| |
|
| |
|
| عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.
| | ===<code>[[Ruby/Float/finite-3F|finite?]]</code>=== |
| | يتحقق إذا كان العدد العشري الذي استدعي معه عددًا عشريًّا صالحًا وفقًا لمعيار IEEE؛ أي أنه ليس عددٌ لا نهائي ويعيد التابع <code>nan?</code> القيمة <code>false</code> معه. |
|
| |
|
| إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.
| | ===<code>[[Ruby/Float/floor|floor]]</code>=== |
| | يعيد أكبر عدد من الأعداد الأصغر من أو تساوي العدد العشري الذي استُدعي معه وبدقة محدَّدة. |
|
| |
|
| إذا أُتيح وسيط الكلمة المفتاحية half الاختياري، ستُقرَّب الأرقام التي تقع في المنتصف بين قيمتين مقرَّبتين ممكنتين وفقًا للوضع mode المُحدَّد الكاسر للعلاقة:
| | ===<code>[[Ruby/Float/hash|hash]]</code>=== |
| | يعيد القيمة hash للعدد العشري الذي استدعي معه. |
|
| |
|
| :up أو nil: تقريب النصف بعيدًا عن الصفر (الوضع الافتراضي). | | ===<code>[[Ruby/Float/infinite-3F|infinite?]]</code>=== |
| | يتحقق إذا ما إن كان العدد الذي استدعي معه منتهيًا (finite) أو غير منتهي من الطرف السالب (<code>-Infinity</code>) أو غير منتهي من الطرف الموجب (<code>+Infinity</code>). |
|
| |
|
| :down: تقريب النصف باتجاه الصفر.
| | ===<code>[[Ruby/Float/inspect|inspect]]</code>=== |
| | هو اسم بديل للتابع <code>to_s</code>. |
|
| |
|
| :even: تقريب النصف باتجاه أقرب عدد زوجي.
| | ===<code>[[Ruby/Float/magnitude|magnitude]]</code>=== |
| | يعيد القيمة المطلقة للعدد العشري الذي استُدعي معه. |
|
| |
|
| to_f → self
| | ===<code>[[Ruby/Float/modulo|modulo]]</code>=== |
| | يعيد باقي عملية قسمة العدد العشري الذي استُدعي معه على العدد المُعطى. |
|
| |
|
| بما أن float هو بالأصل Float، يُعيد self.
| | ===<code>[[Ruby/Float/nan-3F|nan?]]</code>=== |
| | يتحقق إذا كان العدد العشري الذي استدعي معه عددًا عشريًّا غير صالح وفقًا لمعيار IEEE. |
|
| |
|
| to_i → integer
| | ===<code>[[Ruby/Float/negative-3F|negative?]]</code>=== |
| | يتحقق إن كان العدد العشري الذي استُدعي معه عددًا سالبًا. |
|
| |
|
| to_int → integer
| | ===<code>[[Ruby/Float/next_float|next_float]]</code>=== |
| | يعيد العدد العشري الذي يلي العدد العشري الذي استُدعي معه. |
|
| |
|
| إعادة float مبتورًا إلى Integer.
| | ===<code>[[Ruby/Float/numerator|numerator]]</code>=== |
| | يعيد البسط للعد الكسري الذي استدعي معه. |
|
| |
|
| يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:
| | ===<code>[[Ruby/Float/phase|phase]]</code>=== |
| | يعيد القيمة <code>0</code> إن كان العدد العشري الذي استُدعي معه موجبًا، أو يعيد القيمة <code>[[Ruby/Math/PI|pi]]</code>خلاف ذلك. |
|
| |
|
| to_int هو اسم مستعار لـ to_i.
| | ===<code>[[Ruby/Float/positive-3F|positive?]]</code>=== |
| | يتحقق إن كان العدد العشري الذي استُدعي معه عددًا موجبًا. |
|
| |
|
| to_int → integer
| | ===<code>[[Ruby/Float/prev_float|prev_float]]</code>=== |
| | يعيد العدد العشري الذي يسبق العدد العشري الذي استُدعي معه. |
|
| |
|
| إعادة float مبتورًا إلى Integer.
| | ===<code>[[Ruby/Float/quo|quo]]</code>=== |
| | يعيد ناتج قسم العدد العشري المستدعى معه على العدد العشري المُمرَّر إليه. |
|
| |
|
| يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:
| | ===<code>[[Ruby/Float/rationalize|rationalize]]</code>=== |
| | يعيد قيمة تقريبة بسيطة (<code>flt-|eps| <= result <= flt+|eps|</code>) للعدد العشري الذي استدعي معه. |
|
| |
|
| to_int هو اسم مستعار لـ to_i.
| | ===<code>[[Ruby/Float/round|round]]</code>=== |
| | يقرِّب العدد الذي استُدعي معه إلى أقرب قيمة بدقة محدَّدة. |
|
| |
|
| to_r → rational
| | ===<code>[[Ruby/Float/to_f|to_f]]</code>=== |
| | يعيد العدد العشري الذي استدعي معه نفسه. |
|
| |
|
| إعادة قيمة نسبية.
| | ===<code>[[Ruby/Float/to_i|to_i]]</code>=== |
| | يحول العدد العشري الذي استُدعي معه إلى <nowiki/>[[Ruby/Integer|عدد صحيح]]. |
|
| |
|
| ملاحظة: 0.3.to_r ليس هي نفسه “0.3”.to_r. وهذا الأخير يعادل "3/10".to_r، ولكن الأول ليس كذلك.
| | ===<code>[[Ruby/Float/to_int|to_int]]</code>=== |
| | يحول العدد العشري الذي استُدعي معه إلى <nowiki/>[[Ruby/Integer|عدد صحيح]]. |
|
| |
|
| انظر أيضا #rationalize.
| | ===<code>[[Ruby/Float/to_r|to_r]]</code>=== |
| ====<code>to_s → string</code>====
| | يحول العدد العشري الذي استُدعي معه إلى <nowiki/>[[Ruby/Rational|عدد جذري]] (rational). |
| إعادة سلسلة تحتوي على تمثيل self. كما هو حال الشكل الثابت أو الأسي لـ float، قد يُعيد الاستدعاء NaN و Infinity و -Infinity.
| |
|
| |
|
| ويُعيَّن له أيضًا الاسم المستعار: inspect
| | ===<code>[[Ruby/Float/to_s|to_s]]</code>=== |
| ====<code>truncate([ndigits]) → integer or float</code>====
| | يحول العدد العشري الذي استدعي معه إلى سلسلة نصية. |
| إعادة float مبتورًا (نحو الصفر) إلى دقة أرقام عشرية ndigits (القيمة الافتراضية: 0).
| |
|
| |
|
| عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.
| | ===<code>[[Ruby/Float/truncate|truncate]]</code>=== |
| | يعيد العدد العشري الذي استُدعي معه بعد اقتطاعه إلى دقة (precision) محدَّدة. |
|
| |
|
| إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.
| | ===<code>[[Ruby/Float/zero-3F|zero?]]</code>=== |
| | يتحقق إن كانت قيمة العدد العشري الذي استُدعي معه تساوي الصفر. |
|
| |
|
| يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:
| | == مصادر == |
| ====<code>zero? → true or false</code>==== | | * <span> </span>[http://ruby-doc.org/core-2.5.1/Float.html صفحة الصنف Float في توثيق روبي الرسمي.] |
| إعادة true إذا كان float يساوي 0.
| |
| =مصادر=
| |
| <span> </span>[http://ruby-doc.org/core-2.5.1/Float.html صفحة Float في توثيق روبي الرسمي.] | |
| [[تصنيف:Ruby]] | | [[تصنيف:Ruby]] |
| | [[تصنيف:Ruby Class]] |
| | [[تصنيف:Ruby Float]] |
تمثِّل كائنات الصنف Float
أعدادًا حقيقيةً غير دقيقة (inexact real numbers) باستخدام التمثيل العشري ذي الدقة المضاعفة للبنية الأصلية.
للمنازل العشرية حساب مختلف وهو عدد غير دقيق، لذا يجب معرفة نظامها الخاص. نقترخ عليك الاطلاع على الصفحات التالية:
الثوابت
DIG
الحد الأدنى لعدد الأرقام العشرية ذات الدلالة في المنازل العشرية المزدوجة الدقة. وعادةً ما تكون قيمته الافتراضية 15
.
EPSILON
الفرق بين 1
و أصغر عدد عشري ذي دقة مضاعفة أكبر من 1
من نوع النقطة العائمة المزدوجة الدقة. وعادة ما تكون قيمته الافتراضية هي 2.2204460492503131e-16
.
INFINITY
يمثل اللانهاية الموجبة.
MANT_DIG
عدد الأرقام الأساسية للأعداد العشرية المضاعفة (أي البيانات ذات النوع double). وعادةً ما تكون قيمته الافتراضية هي 53
.
MAX
أكبر عدد صحيح في العدد العشري ذي الدقة المضاعفة. وعادةً ما تكون قيمته الافتراضية 1.7976931348623157e+308
.
MAX_10_EXP
أكبر أس موجب في العدد العشري ذي الدقة المضاعفة حيث تكون القيمة 10
مرفوعة إلى هذا الأس بعد طرح القيمة 1
منها. وعادةً ما تكون قيمته الافتراضية هي 308
.
MAX_EXP
أكبر قيمة أس محتملة في العدد العشري ذي الدقة المضاعفة. وعادةً ما تكون قيمته الافتراضية هي 1024
.
MIN
أصغر رقم طبيعي (normalized number) موجب في العدد العشري ذي الدقة المضاعفة. وعادة ما تكون قيمته الافتراضية 2.2250738585072014e-308
.
إذا كانت المنصة تدعم الأعداد غير الطبيعية (denormalized numbers)، فسيكون هناك أرقام بين الصفر والقيمة Float::MIN
. وتعيد 0.0.next_float
أصغر عدد عشري موجب بما في ذلك الأعداد غير الطبيعية (denormalized numbers).
MIN_10_EXP
أصغر أس سالب في العدد العشري ذي الدقة المضاعفة إذ تكون 10
مرفوعة إلى هذا الأس ناقص 1
. وعادةً ما تكون قيمته الافتراضية -307
.
MIN_EXP
أصغر قيمة أس محتملة في العدد العشري ذي الدقة المضاعفة. وعادةً ما تكون قيمته الافتراضية -1021
.
NAN
تعبير يمثل القيمة "ليست عددًا" (not a number).
RADIX
أساس العدد العشري، أو عدد الأرقام الفريدة المستخدمة لتمثيل العدد. وعادةً ما تكون قيمته الافتراضية 2
على معظم الأنظمة، والتي تمثل النظام العشري ذي الأساس 10
.
ROUNDS
يمثل وضع التقريب لإضافة المنازل العشرية. وعادةً ما تكون قيمته الافتراضية 1
، التقريب إلى أقرب عدد.
وتشمل الأوضاع الأخرى:
2
: التقريب نحو اللانهاية الموجبة.
3
: التقريب نحو اللانهاية السالبة.
توابع النسخة العامة
يعيد باقي عملية قسمة عدد عشري على عدد آخر.
يعيد ناتج عملية ضرب عدد عشري بعدد آخر.
يعيد ناتج عملية رفع عدد عشري (الأساس) إلى قوة عدد محدد (الأس).
يعيد ناتج عملية الجمع بين عددين.
يعيد ناتج عملية الطرح بين عددين.
إن استُعمِل هذا المعامل بالشكل -Float
، فسيعيد القيمة المعاكسة للعدد Float
العشري (أي القيمة السالبة إن كان Float
موجبًا أو العكس بالعكس).
يعيد ناتج عملية القسمة بين عدد عشري وعدد آخر.
يعيد القيمة true
إن كانت قيمة العدد العشري الواقع على يساره أصغر من قيمة العدد المواقع على يمينه.
يعيد القيمة true
إن كانت قيمة العدد العشري الواقع على يساره أصغر من أو تساوي قيمة العدد الواقع على يمينه.
يعيد عددًا صحيحًا (-1 أو 0 أو +1) إذا كان العدد العشري الواقع على يساره أصغر من أو يساوي أو أكبر من العدد الآخر الواقع على يمينه على التوالي.
يعيد القيمة true
إن كان العدد العشري الواقع على يساره يساوي القيمة الواقعة على يمينه.
يعيد القيمة true
إن كانت قيمة العدد العشري الواقع على يساره أكبر من قيمة العدد الآخر الواقع على يمينه.
يعيد القيمة true
إن كانت قيمة العدد العشري الواقع على يساره أكبر من أو تساوي قيمة العدد الآخر الواقع على يمينه.
يعيد القيمة المطلقة للعدد العشري الذي استُدعي معه.
يعيد القيمة 0
إن كان العدد العشري الذي استُدعي معه موجبًا، أو القيمة pi
خلاف ذلك.
يعيد القيمة 0
إن كان العدد العشري الذي استُدعي معه موجبًا، أو القيمة pi
خلاف ذلك.
يعيد أصغر عدد من الأعداد الأكبر من أو تساوي العدد العشري الذي استُدعي معه وبدقة محدَّدة.
يحول العدد المستدعى معها والعدد العشري المُمرَّر إليها إلى النوع Float
ويعيدهما في مصفوفة.
يعيد المقام (denominator) للعدد الكسري الذي استدعي معه، ويكون دائمًا موجبًا.
يعيد مصفوفة تحتوي على حاصل (quotient) وباقي قسمة العدد الذي استُدعي معه على العدد المُمرَّر إليه.
يتحقق إن كان العدد الذي استُدعي معه والعدد المُمرَّر إليه من نفس النوع (أي كلاهما عدد عشري) ومتساويين في القيمة.
يجري عملية القسمة بين العدد الذي استدعي معه والعدد الذي مُرِّر إليه ثم يعيد الناتج في عدد عشري.
يتحقق إذا كان العدد العشري الذي استدعي معه عددًا عشريًّا صالحًا وفقًا لمعيار IEEE؛ أي أنه ليس عددٌ لا نهائي ويعيد التابع nan?
القيمة false
معه.
يعيد أكبر عدد من الأعداد الأصغر من أو تساوي العدد العشري الذي استُدعي معه وبدقة محدَّدة.
يعيد القيمة hash للعدد العشري الذي استدعي معه.
يتحقق إذا ما إن كان العدد الذي استدعي معه منتهيًا (finite) أو غير منتهي من الطرف السالب (-Infinity
) أو غير منتهي من الطرف الموجب (+Infinity
).
هو اسم بديل للتابع to_s
.
يعيد القيمة المطلقة للعدد العشري الذي استُدعي معه.
يعيد باقي عملية قسمة العدد العشري الذي استُدعي معه على العدد المُعطى.
يتحقق إذا كان العدد العشري الذي استدعي معه عددًا عشريًّا غير صالح وفقًا لمعيار IEEE.
يتحقق إن كان العدد العشري الذي استُدعي معه عددًا سالبًا.
يعيد العدد العشري الذي يلي العدد العشري الذي استُدعي معه.
يعيد البسط للعد الكسري الذي استدعي معه.
يعيد القيمة 0
إن كان العدد العشري الذي استُدعي معه موجبًا، أو يعيد القيمة pi
خلاف ذلك.
يتحقق إن كان العدد العشري الذي استُدعي معه عددًا موجبًا.
يعيد العدد العشري الذي يسبق العدد العشري الذي استُدعي معه.
يعيد ناتج قسم العدد العشري المستدعى معه على العدد العشري المُمرَّر إليه.
يعيد قيمة تقريبة بسيطة (flt-|eps| <= result <= flt+|eps|
) للعدد العشري الذي استدعي معه.
يقرِّب العدد الذي استُدعي معه إلى أقرب قيمة بدقة محدَّدة.
يعيد العدد العشري الذي استدعي معه نفسه.
يحول العدد العشري الذي استُدعي معه إلى عدد صحيح.
يحول العدد العشري الذي استُدعي معه إلى عدد صحيح.
يحول العدد العشري الذي استُدعي معه إلى عدد جذري (rational).
يحول العدد العشري الذي استدعي معه إلى سلسلة نصية.
يعيد العدد العشري الذي استُدعي معه بعد اقتطاعه إلى دقة (precision) محدَّدة.
يتحقق إن كانت قيمة العدد العشري الذي استُدعي معه تساوي الصفر.
مصادر