الفرق بين المراجعتين ل"Ruby/Float"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: الأعداد العشرية Float في روبي}}</noinclude>
 
 
تمثل كائنات Float أرقامًا حقيقية غير دقيقة باستخدام تمثيل النقطة العائمة المزدوجة الدقة للبنية الأصلية.
 
تمثل كائنات Float أرقامًا حقيقية غير دقيقة باستخدام تمثيل النقطة العائمة المزدوجة الدقة للبنية الأصلية.
  
سطر 9: سطر 8:
  
 
[[en.wikipedia.org/wiki/Floating_point#Accuracy_problems]]
 
[[en.wikipedia.org/wiki/Floating_point#Accuracy_problems]]
 
+
===الثوابت===
=== الثوابت ===
+
====<code>DIG</code>====
 
 
==== <code>DIG</code> ====
 
 
الحد الأدنى لعدد الأرقام العشرية ذات الدلالة في النقطة العائمة المزدوجة الدقة.
 
الحد الأدنى لعدد الأرقام العشرية ذات الدلالة في النقطة العائمة المزدوجة الدقة.
  
 
وعادة ما تكون قيمته الافتراضية <code>15</code>.
 
وعادة ما تكون قيمته الافتراضية <code>15</code>.
 
+
====<code>EPSILON</code>====
==== <code>EPSILON</code> ====
 
 
الفرق بين <code>1</code> و أصغر عدد أكبر من <code>1</code> من نوع النقطة العائمة المزدوجة الدقة.
 
الفرق بين <code>1</code> و أصغر عدد أكبر من <code>1</code> من نوع النقطة العائمة المزدوجة الدقة.
  
 
وعادة ما تكون قيمته الافتراضية <code>2.2204460492503131e-16</code>.
 
وعادة ما تكون قيمته الافتراضية <code>2.2204460492503131e-16</code>.
 
+
====<code>INFINITY</code>====
==== <code>INFINITY</code> ====
 
 
تعبير يمثل اللانهاية الموجبة.
 
تعبير يمثل اللانهاية الموجبة.
 
+
====<code>MANT_DIG</code>====
==== <code>MANT_DIG</code> ====
 
 
عدد الأرقام الأساسية لنوع البيانات المزدوج (double).
 
عدد الأرقام الأساسية لنوع البيانات المزدوج (double).
  
 
وعادة ما تكون قيمته الافتراضية <code>53</code>.
 
وعادة ما تكون قيمته الافتراضية <code>53</code>.
 
+
====<code>MAX</code>====
==== <code>MAX</code> ====
 
 
أكبر عدد صحيح في النقطة العائمة المزدوجة الدقة.
 
أكبر عدد صحيح في النقطة العائمة المزدوجة الدقة.
  
 
وعادة ما تكون قيمته الافتراضية <code>1.7976931348623157e+308</code>.
 
وعادة ما تكون قيمته الافتراضية <code>1.7976931348623157e+308</code>.
 
+
====<code>MAX_10_EXP</code>====
==== <code>MAX_10_EXP</code> ====
 
 
أكبر أس موجب في النقطة العائمة المزدوجة الدقة حيث تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>.
 
أكبر أس موجب في النقطة العائمة المزدوجة الدقة حيث تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>.
  
 
وعادة ما تكون قيمته الافتراضية <code>308</code>.
 
وعادة ما تكون قيمته الافتراضية <code>308</code>.
 
+
====<code>MAX_EXP</code>====
==== <code>MAX_EXP</code> ====
 
 
أكبر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة.
 
أكبر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة.
  
 
وعادة ما تكون قيمته الافتراضية <code>1024</code>.
 
وعادة ما تكون قيمته الافتراضية <code>1024</code>.
 
+
====<code>MIN</code>====
==== <code>MIN</code> ====
 
 
أصغر رقم مُعيَّر موجب في النقطة العائمة المزدوجة الدقة.
 
أصغر رقم مُعيَّر موجب في النقطة العائمة المزدوجة الدقة.
  
سطر 51: سطر 41:
  
 
إذا كانت المنصة تدعم الأرقام غير المُعيَّرة، يكون هناك أرقام بين صفر و <code>Float::MIN</code>. وتعيد <code>‎0.0.next_float</code> أصغر نقطة عائمة موجبة بما في ذلك الأرقام غير المُعيَّرة.
 
إذا كانت المنصة تدعم الأرقام غير المُعيَّرة، يكون هناك أرقام بين صفر و <code>Float::MIN</code>. وتعيد <code>‎0.0.next_float</code> أصغر نقطة عائمة موجبة بما في ذلك الأرقام غير المُعيَّرة.
 
+
====<code>MIN_10_EXP</code>====
==== <code>MIN_10_EXP</code> ====
 
 
أصغر أس سالب في النقطة العائمة المزدوجة الدقة حيث تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>.
 
أصغر أس سالب في النقطة العائمة المزدوجة الدقة حيث تكون <code>10</code> مرفوعة إلى هذا الأس ناقص <code>1</code>.
  
 
وعادة ما تكون قيمته الافتراضية <code>‎-307</code>.
 
وعادة ما تكون قيمته الافتراضية <code>‎-307</code>.
 
+
====<code>MIN_EXP</code>====
==== <code>MIN_EXP</code> ====
 
 
أصغر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة.
 
أصغر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة.
  
 
وعادة ما تكون قيمته الافتراضية <code>‎-1021</code>.
 
وعادة ما تكون قيمته الافتراضية <code>‎-1021</code>.
 
+
====<code>NAN</code>====
==== <code>NAN</code> ====
 
 
تعبير يمثل القيمة "ليست عددًا" (not a number).
 
تعبير يمثل القيمة "ليست عددًا" (not a number).
 
+
====<code>RADIX</code>====
==== <code>RADIX</code> ====
 
 
أساس النقطة العائمة، أو عدد الأرقام الفريدة المستخدمة لتمثيل الرقم.
 
أساس النقطة العائمة، أو عدد الأرقام الفريدة المستخدمة لتمثيل الرقم.
  
 
وعادة ما تكون قيمته الافتراضية <code>2</code> على معظم الأنظمة، والتي تمثل النظام العشري للأساس <code>10</code>.
 
وعادة ما تكون قيمته الافتراضية <code>2</code> على معظم الأنظمة، والتي تمثل النظام العشري للأساس <code>10</code>.
 
+
====<code>ROUNDS</code>====
==== <code>ROUNDS</code> ====
 
 
يمثل وضع التقريب لإضافة النقطة العائمة.
 
يمثل وضع التقريب لإضافة النقطة العائمة.
  
سطر 86: سطر 71:
  
 
<code>3</code> : التقريب نحو اللانهاية السالبة.
 
<code>3</code> : التقريب نحو اللانهاية السالبة.
 
+
===توابع المثيل العام===
=== توابع المثيل العام ===
+
====<code>float % other → float</code>====
 
 
==== <code>float % other → float</code> ====
 
 
إعادة الوحدة بعد قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
 
إعادة الوحدة بعد قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
 
6543.21.modulo(137)      #=> 104.21000000000004
 
6543.21.modulo(137)      #=> 104.21000000000004
سطر 116: سطر 99:
 
              
 
              
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float * other → float</code>====
==== <code>float * other → float</code> ====
 
 
إعادة Float جديد والذي يكون هو نتاج حاصل ضرب <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
 
إعادة Float جديد والذي يكون هو نتاج حاصل ضرب <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
 
   
 
   
سطر 137: سطر 119:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float ** other → float</code>====
==== <code>float ** other → float</code> ====
 
 
رفع <code>float</code> للأس <code>other</code>.<syntaxhighlight lang="ruby">
 
رفع <code>float</code> للأس <code>other</code>.<syntaxhighlight lang="ruby">
 
2.0**3  #=> 8.0
 
2.0**3  #=> 8.0
سطر 169: سطر 150:
 
              
 
              
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float + other → float</code>====
==== <code>float + other → float</code> ====
 
 
إعادة Float جديد والذي يكون هو نتاج حاصل جمع <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
 
إعادة Float جديد والذي يكون هو نتاج حاصل جمع <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
 
   
 
   
سطر 190: سطر 170:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float - other → float</code>====
==== <code>float - other → float</code> ====
 
 
إعادة Float جديد والذي يكون هو الفرق بين <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
 
إعادة Float جديد والذي يكون هو الفرق بين <code>float</code> و <code>other</code>.<syntaxhighlight lang="ruby">
  
سطر 212: سطر 191:
 
              
 
              
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>‎-float → float</code>====
==== <code>‎-float → float</code> ====
 
 
إعادة <code>float</code> بعلامة سالبة.<syntaxhighlight lang="ruby">
 
إعادة <code>float</code> بعلامة سالبة.<syntaxhighlight lang="ruby">
 
   
 
   
سطر 223: سطر 201:
 
              
 
              
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float / other → float</code>====
==== <code>float / other → float</code> ====
 
 
إعادة Float جديد والذي يكون نتاج حاصل قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
 
إعادة Float جديد والذي يكون نتاج حاصل قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
 
   
 
   
سطر 249: سطر 226:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float < real → true or false</code>====
==== <code>float < real → true or false</code> ====
 
 
إعادة <code>true</code> إذا كان <code>float</code> أقل من <code>real</code>.
 
إعادة <code>true</code> إذا كان <code>float</code> أقل من <code>real</code>.
  
سطر 283: سطر 259:
 
            
 
            
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float <= real → true or false</code>====
==== <code>float <= real → true or false</code> ====
 
 
إعادة <code>true</code> إذا كان <code>float</code> أقل من أو يساوي <code>real</code>.
 
إعادة <code>true</code> إذا كان <code>float</code> أقل من أو يساوي <code>real</code>.
  
سطر 317: سطر 292:
 
          
 
          
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float <=> real → -1, 0, +1, or nil</code>====
==== <code>float <=> real → -1, 0, +1, or nil</code> ====
 
 
إعادة ‎-1 ، 0 أو ‎+1 اعتمادًا على ما إذا كان <code>float</code> أقل من أو يساوي أو أكبر من <code>real</code>. هذا هو أساس الاختبارات في وحدة [[Ruby/Comparable|Comparable]].
 
إعادة ‎-1 ، 0 أو ‎+1 اعتمادًا على ما إذا كان <code>float</code> أقل من أو يساوي أو أكبر من <code>real</code>. هذا هو أساس الاختبارات في وحدة [[Ruby/Comparable|Comparable]].
  
سطر 358: سطر 332:
 
            
 
            
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float == obj → true or false</code>====
==== <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">
 
إعادة <code>true</code> فقط إذا كانت قيمة <code>obj</code> نفس قيمة <code>float</code>. علي عكس ذلك تحتاج ‎<code>#eql?</code>‎ أن يكون <code>obj</code> من النوع Float.<syntaxhighlight lang="ruby">
 
1.0 == 1  #=> true
 
1.0 == 1  #=> true
سطر 390: سطر 363:
 
              
 
              
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float == obj → true or false</code>====
==== <code>float == obj → true or false</code> ====
 
 
إعادة <code>true</code> فقط إذا كانت قيمة <code>obj</code> نفس قيمة <code>float</code>. علي عكس ذلك تحتاج ‎<code>#eql?</code>‎ أن يكون <code>obj</code> من نوع Float.
 
إعادة <code>true</code> فقط إذا كانت قيمة <code>obj</code> نفس قيمة <code>float</code>. علي عكس ذلك تحتاج ‎<code>#eql?</code>‎ أن يكون <code>obj</code> من نوع Float.
  
سطر 419: سطر 391:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float > real → true or false</code>====
==== <code>float > real → true or false</code> ====
 
 
إعادة <code>true</code> إذا كان <code>float</code> أكبر من <code>real</code>.
 
إعادة <code>true</code> إذا كان <code>float</code> أكبر من <code>real</code>.
  
سطر 452: سطر 423:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>float >= real → true or false</code>====
==== <code>float >= real → true or false</code> ====
 
 
إعادة <code>true</code> إذا كان <code>float</code> أكبر من أو يساوي <code>real</code>.
 
إعادة <code>true</code> إذا كان <code>float</code> أكبر من أو يساوي <code>real</code>.
  
سطر 486: سطر 456:
 
        
 
        
 
</syntaxhighlight>
 
</syntaxhighlight>
 
+
====<code>abs → float</code>====
==== <code>abs → float</code> ====
 
 
إعادة القيمة المطلقة للتابع <code>float</code>.<syntaxhighlight lang="ruby">
 
إعادة القيمة المطلقة للتابع <code>float</code>.<syntaxhighlight lang="ruby">
 
(-34.56).abs  #=> 34.56
 
(-34.56).abs  #=> 34.56
سطر 502: سطر 471:
 
              
 
              
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
====<code>angle → 0 or float</code>====
 +
إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.<syntaxhighlight lang="ruby">
  
==== <code>angle → 0 or float</code> ====
+
              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">
 
إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.<syntaxhighlight lang="ruby">
 
+
 
               static VALUE
 
               static VALUE
 
float_arg(VALUE self)
 
float_arg(VALUE self)
سطر 516: سطر 497:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
====<code>ceil([ndigits]) → integer or float</code>====
 +
إعادة أصغر رقم أكبر من أو يساوي <code>float</code> مع دقة <code>ndigits</code> رقم (القيمة الافتراضية: 0).
  
==== <code>arg → 0 or float</code> ====
+
عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره <code>ndigits.abs</code> على الأقل.
إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.
 
  
==== <code>ceil([ndigits]) → integer or float</code> ====
+
إعادة رقم نقطة عائمة عندما يكون <code>ndigits</code> موجبًا، وإلا يُعاد عددٌ صحيحٌ.<syntaxhighlight lang="ruby">
إعادة أصغر رقم أكبر من أو يساوي float مع دقة ndigits رقم (القيمة الافتراضية: 0).
+
1.2.ceil      #=> 2
 +
2.0.ceil      #=> 2
 +
(-1.2).ceil  #=> -1
 +
(-2.0).ceil  #=> -2
  
عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.
+
1.234567.ceil(2)  #=> 1.24
 +
1.234567.ceil(3)  #=> 1.235
 +
1.234567.ceil(4)  #=> 1.2346
 +
1.234567.ceil(5)  #=> 1.23457
  
إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.
+
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.
  
==== <code>coerce(numeric) array</code> ====
+
ويتحقق ذلك عن طريق تحويل numeric إلى Float.<syntaxhighlight lang="ruby">
إعادة مصفوفة يتمثَّل فيها كلٌ من numeric و float ككائنات Float.
+
1.2.coerce(3)      #=> [3.0, 1.2]
 +
2.5.coerce(1.1)    #=> [1.1, 2.5]
 +
</syntaxhighlight>
 +
====<code>denominator integer</code>====
 +
إعادة المقام (موجب دائمًا). والنتيجة تعتمد على الآلة.
  
ويتحقق ذلك عن طريق تحويل numeric إلى Float.
+
انظر أيضا <code>‎#numerator</code>.<syntaxhighlight lang="ruby">
  
==== <code>denominator integer</code> ====
+
              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
  
انظر أيضا #numerator.
+
</syntaxhighlight>نتيجة NaN.eql?(NaN)غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.<syntaxhighlight lang="ruby">
  
==== <code>divmod(numeric) → array</code> ====
+
              VALUE
راجع Numeric#divmod.
+
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">
  
==== <code>eql?(obj) → true or false</code> ====
+
              static VALUE
إعادة true فقط إذا كانت obj من النوع Float وله نفس قيمة float. علي النقيض من ذلك مع Float#==‎، الذي يُجري تحويلات على النوع.
+
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">
  
نتيجة NaN.eql?(NaN)‎ غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.
+
              VALUE
 +
rb_flo_is_finite_p(VALUE num)
 +
{
 +
    double value = RFLOAT_VALUE(num);
  
==== <code>fdiv(numeric) → float</code> ====
+
#ifdef HAVE_ISFINITE
إعادة float / numeric، مثل Float#/‎.
+
    if (!isfinite(value))
 +
        return Qfalse;
 +
#else
 +
    if (isinf(value) || isnan(value))
 +
        return Qfalse;
 +
#endif
  
==== <code>finite? true or false</code> ====
+
    return Qtrue;
إعادة true إذا كان float عدد نقطة عائمة IEEE صالح، أي أنه ليس لا نهائي و ‎#nan?‎ قيمتها false.
+
}
 +
         
 +
</syntaxhighlight>
 +
====<code>floor([ndigits]) integer or float</code>====
 +
إعادة أكبر رقم أصغر من أو يساوي <code>float</code> مع دقة <code>ndigits</code> رقم عشري (القيمة الافتراضية: 0).
  
==== <code>floor([ndigits]) → integer or float</code> ====
+
عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره <code>ndigits.abs</code> على الأقل.
إعادة أكبر رقم أصغر من أو يساوي float مع دقة ndigits رقم عشري (القيمة الافتراضية: 0).
 
  
عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.
+
إعادة رقم نقطة عائمة عندما يكون <code>ndigits</code> موجبًا، وإلا يُعاد عددٌ صحيحٌ.<syntaxhighlight lang="ruby">
 +
1.2.floor      #=> 1
 +
2.0.floor      #=> 2
 +
(-1.2).floor  #=> -2
 +
(-2.0).floor  #=> -2
  
إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.
+
1.234567.floor(2)  #=> 1.23
 +
1.234567.floor(3)  #=> 1.234
 +
1.234567.floor(4)  #=> 1.2345
 +
1.234567.floor(5)  #=> 1.23456
  
يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:
+
34567.89.floor(-5)  #=> 0
 +
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 (!)
  
==== <code>hash → integer</code> ====
+
</syntaxhighlight>
 +
====<code>hash → integer</code>====
 
إعادة رمز التجزئة لهذا الرقم العشري.
 
إعادة رمز التجزئة لهذا الرقم العشري.
  
راجع أيضًا Object#hash.
+
راجع أيضًا <code>Object#hash</code>.<syntaxhighlight lang="ruby">
 +
 +
              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">
  
==== <code>infinite? → -1, 1, or nil</code> ====
+
              VALUE
إعادة nil أو ‎-1، أو 1 اعتمادًا علي ما إذا كانت القيمة محدودة، أو ‎-Infinity، أو ‎+Infinity.
+
rb_float_abs(VALUE flt)
 
+
{
==== <code>inspect()</code> ====
+
    double val = fabs(RFLOAT_VALUE(flt));
اسم المستعار لـ to_s
+
    return DBL2NUM(val);
 
+
}
==== <code>magnitude → float</code> ====
+
</syntaxhighlight>
إعادة القيمة المطلقة للتابع float.
+
====<code>modulo(other) → float</code>====
 
+
إعادة الوحدة بعد قسمة <code>float</code> على <code>other</code>.<syntaxhighlight lang="ruby">
<nowiki>#</nowiki>magnitude اسم مستعار للتابع ‎#abs.
+
6543.21.modulo(137)      #=> 104.21000000000004
 
+
6543.21.modulo(137.24)  #=> 92.92999999999961
==== <code>modulo(other) → float</code> ====
+
</syntaxhighlight>
إعادة الوحدة بعد قسمة float على other.
+
====<code>nan? → true or false</code>====
 
 
==== <code>nan? → true or false</code> ====
 
 
إعادة true إذا كان float عدد نقطة عائمة IEEE غير صالح.
 
إعادة true إذا كان float عدد نقطة عائمة IEEE غير صالح.
 
+
====<code>empty? → true or false</code>====
==== <code>empty? → true or false</code> ====
 
 
إعادة true إذا كان float أقل من 0.
 
إعادة true إذا كان float أقل من 0.
 
+
====<code>next_float → float</code>====
==== <code>next_float → float</code> ====
 
 
إعادة عدد النقطة العائمة القابل للتمثيل التالي.
 
إعادة عدد النقطة العائمة القابل للتمثيل التالي.
  
سطر 595: سطر 687:
  
 
فعلى سبيل المثال:
 
فعلى سبيل المثال:
 
+
====<code>numerator → integer</code>====
==== <code>numerator → integer</code> ====
 
 
إعادة البسط. والنتيجة تعتمد على الآلة.
 
إعادة البسط. والنتيجة تعتمد على الآلة.
  
 
انظر أيضا ‎#denominator.
 
انظر أيضا ‎#denominator.
 
+
====<code>phase → 0 or float</code>====
==== <code>phase → 0 or float</code> ====
 
 
إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.
 
إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.
 
+
====<code>positive? → true or false</code>====
==== <code>positive? → true or false</code> ====
 
 
إعادة true إذا كان float أكبر من 0.
 
إعادة true إذا كان float أكبر من 0.
 
+
====<code>prev_float → float</code>====
==== <code>prev_float → float</code> ====
 
 
إعادة عدد النقطة العائمة القابل للتمثيل السابق.
 
إعادة عدد النقطة العائمة القابل للتمثيل السابق.
  
سطر 615: سطر 703:
  
 
فعلى سبيل المثال:
 
فعلى سبيل المثال:
 
+
====<code>quo(numeric) → float</code>====
==== <code>quo(numeric) → float</code> ====
 
 
إعادة float / numeric، مثل Float#/‎.
 
إعادة float / numeric، مثل Float#/‎.
 
+
====<code>rationalize([eps]) → rational</code>====
==== <code>rationalize([eps]) → rational</code> ====
 
 
إعادة تقريب ابسط للقيمة (flt-|eps| <= result <= flt+|eps|). إذا لم يتاح الوسيط الاختياري eps، سيُختار تلقائيًا.
 
إعادة تقريب ابسط للقيمة (flt-|eps| <= result <= flt+|eps|). إذا لم يتاح الوسيط الاختياري eps، سيُختار تلقائيًا.
  
 
انظر أيضا ‎#to_r.
 
انظر أيضا ‎#to_r.
 
+
====<code>round([ndigits] [, half: mode]) → integer or float</code>====
==== <code>round([ndigits] [, half: mode]) → integer or float</code> ====
 
 
إعادة float مُقرَّب إلى أقرب قيمة بدقة أرقام عشرية مقدارها ndigits (القيمة الافتراضية: 0).
 
إعادة float مُقرَّب إلى أقرب قيمة بدقة أرقام عشرية مقدارها ndigits (القيمة الافتراضية: 0).
  
سطر 668: سطر 753:
  
 
انظر أيضا ‎#rationalize.
 
انظر أيضا ‎#rationalize.
 
+
====<code>to_s → string</code>====
==== <code>to_s → string</code> ====
 
 
إعادة سلسلة تحتوي على تمثيل self. كما هو حال الشكل الثابت أو الأسي لـ float، قد يُعيد الاستدعاء NaN و Infinity و ‎-Infinity.
 
إعادة سلسلة تحتوي على تمثيل self. كما هو حال الشكل الثابت أو الأسي لـ float، قد يُعيد الاستدعاء NaN و Infinity و ‎-Infinity.
  
 
ويُعيَّن له أيضًا الاسم المستعار: inspect
 
ويُعيَّن له أيضًا الاسم المستعار: inspect
 
+
====<code>truncate([ndigits]) → integer or float</code>====
==== <code>truncate([ndigits]) → integer or float</code> ====
 
 
إعادة float مبتورًا (نحو الصفر) إلى دقة أرقام عشرية ndigits (القيمة الافتراضية: 0).
 
إعادة float مبتورًا (نحو الصفر) إلى دقة أرقام عشرية ndigits (القيمة الافتراضية: 0).
  
سطر 682: سطر 765:
  
 
يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:
 
يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:
 
+
====<code>zero? → true or false</code>====
==== <code>zero? → true or false</code> ====
 
 
إعادة true إذا كان float يساوي 0.
 
إعادة true إذا كان float يساوي 0.
 
+
=مصادر=
= مصادر =
+
<span> </span>
* [http://ruby-doc.org/core-2.5.1/Float.html صفحة Float في توثيق روبي الرسمي.]
+
*[http://ruby-doc.org/core-2.5.1/Float.html صفحة Float في توثيق روبي الرسمي.]
 
[[تصنيف:Ruby]]
 
[[تصنيف:Ruby]]

مراجعة 20:16، 16 أكتوبر 2018

تمثل كائنات Float أرقامًا حقيقية غير دقيقة باستخدام تمثيل النقطة العائمة المزدوجة الدقة للبنية الأصلية.

للنقطة العائمة حساب مختلف وهو رقم غير دقيق. لذا يجب معرفة نظامها الخاص. انظر التالي:

docs.sun.com/source/806-3568/ncg_goldberg.html

wiki.github.com/rdp/ruby_tutorials_core/ruby-talk-faq#wiki-floats_imprecise

en.wikipedia.org/wiki/Floating_point#Accuracy_problems

الثوابت

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

أصغر رقم مُعيَّر موجب في النقطة العائمة المزدوجة الدقة.

وعادة ما تكون قيمته الافتراضية 2.2250738585072014e-308.

إذا كانت المنصة تدعم الأرقام غير المُعيَّرة، يكون هناك أرقام بين صفر و Float::MIN. وتعيد ‎0.0.next_float أصغر نقطة عائمة موجبة بما في ذلك الأرقام غير المُعيَّرة.

MIN_10_EXP

أصغر أس سالب في النقطة العائمة المزدوجة الدقة حيث تكون 10 مرفوعة إلى هذا الأس ناقص 1.

وعادة ما تكون قيمته الافتراضية ‎-307.

MIN_EXP

أصغر قيمة أس محتملة في النقطة العائمة المزدوجة الدقة.

وعادة ما تكون قيمته الافتراضية ‎-1021.

NAN

تعبير يمثل القيمة "ليست عددًا" (not a number).

RADIX

أساس النقطة العائمة، أو عدد الأرقام الفريدة المستخدمة لتمثيل الرقم.

وعادة ما تكون قيمته الافتراضية 2 على معظم الأنظمة، والتي تمثل النظام العشري للأساس 10.

ROUNDS

يمثل وضع التقريب لإضافة النقطة العائمة.

وعادة ما تكون قيمته الافتراضية 1، التقريب إلى أقرب عدد.

وتشمل الأوضاع الأخرى:

-1 : مُتعذِّر تحديده.

0 : التقريب نحو الصفر.

1 : التقريب إلى أقرب عدد.

2 : التقريب نحو اللانهاية الموجبة.

3 : التقريب نحو اللانهاية السالبة.

توابع المثيل العام

float % other → float

إعادة الوحدة بعد قسمة float على other.

6543.21.modulo(137)      #=> 104.21000000000004
6543.21.modulo(137.24)   #=> 92.92999999999961
               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));
}

float * other → float

إعادة Float جديد والذي يكون هو نتاج حاصل ضرب float و other.

 
               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, '*');
    }
}

float ** other → float

رفع float للأس other.

2.0**3   #=> 8.0
 
               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));
}

float + other → float

إعادة Float جديد والذي يكون هو نتاج حاصل جمع float و other.

 
               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, '+');
    }
}

float - other → float

إعادة Float جديد والذي يكون هو الفرق بين float و other.

               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, '-');
    }
}

‎-float → float

إعادة float بعلامة سالبة.

 
               VALUE
rb_float_uminus(VALUE flt)
{
    return DBL2NUM(-RFLOAT_VALUE(flt));
}

float / other → float

إعادة Float جديد والذي يكون نتاج حاصل قسمة float على other.

 
               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, '/');
    }
}

float < real → true or false

إعادة true إذا كان float أقل من real.

نتيجة NaN < NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد على التنفيذ.

 
               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;
}

float <= real → true or false

إعادة true إذا كان float أقل من أو يساوي real.

نتيجة NaN <= NaN غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.

               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;
}

float <=> real → -1, 0, +1, or nil

إعادة ‎-1 ، 0 أو ‎+1 اعتمادًا على ما إذا كان float أقل من أو يساوي أو أكبر من real. هذا هو أساس الاختبارات في وحدة Comparable.

نتيجة NaN <=> NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.

إعادة nil إذا كانت القيمتين غير صالحتين للمقارنة.

               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);
}

float == obj → true or false

إعادة true فقط إذا كانت قيمة obj نفس قيمة float. علي عكس ذلك تحتاج ‎#eql?‎ أن يكون obj من النوع Float.

1.0 == 1   #=> true

نتيجة NaN == NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.

 
               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;
}

float == obj → true or false

إعادة true فقط إذا كانت قيمة obj نفس قيمة float. علي عكس ذلك تحتاج ‎#eql?‎ أن يكون obj من نوع Float.

نتيجة NaN == NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.

     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;
}

float > real → true or false

إعادة true إذا كان float أكبر من real.

نتيجة NaN > NaN غير مُعرَّفة، لذا تُعاد قيمة تعتمد علي التنفيذ.

 
               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;
}

float >= real → true or false

إعادة true إذا كان float أكبر من أو يساوي real.

نتيجة NaN >= NaN غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.

               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;
}

abs → float

إعادة القيمة المطلقة للتابع float.

(-34.56).abs   #=> 34.56
-34.56.abs     #=> 34.56
34.56.abs      #=> 34.56

#magnitude اسم مستعار للتابع ‎#abs.

 
               VALUE
rb_float_abs(VALUE flt)
{
    double val = fabs(RFLOAT_VALUE(flt));
    return DBL2NUM(val);
}

angle → 0 or float

إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.

               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);
}

arg → 0 or float

إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.

 
               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);
}

ceil([ndigits]) → integer or float

إعادة أصغر رقم أكبر من أو يساوي float مع دقة ndigits رقم (القيمة الافتراضية: 0).

عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.

إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.

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

يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:

(2.1 / 0.7).ceil  #=> 4 (!)

coerce(numeric) → array

إعادة مصفوفة يتمثَّل فيها كلٌ من numeric و float ككائنات Float.

ويتحقق ذلك عن طريق تحويل numeric إلى Float.

1.2.coerce(3)       #=> [3.0, 1.2]
2.5.coerce(1.1)     #=> [1.1, 2.5]

denominator → integer

إعادة المقام (موجب دائمًا). والنتيجة تعتمد على الآلة.

انظر أيضا ‎#numerator.

               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);
}

divmod(numeric) → array

راجع Numeric#divmod.

42.0.divmod(6)   #=> [7, 0.0]
42.0.divmod(5)   #=> [8, 2.0]

eql?(obj) → true or false

إعادة true فقط إذا كانت obj من النوع Float وله نفس قيمة float. علي النقيض من ذلك مع Float#==‎، الذي يُجري تحويلات على النوع.

1.0.eql?(1)   #=> false

نتيجة NaN.eql?(NaN)‎ غير معرفة، لذا تُعاد قيمة تعتمد على التنفيذ.

               VALUE
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;
}

fdiv(numeric) → float

إعادة float / numeric، مثل Float#/‎.

               static VALUE
flo_quo(VALUE x, VALUE y)
{
    return num_funcall1(x, '/', y);
}

finite? → true or false

إعادة true إذا كان float عدد نقطة عائمة IEEE صالح، أي أنه ليس لا نهائي و ‎#nan?‎ قيمتها false.

               VALUE
rb_flo_is_finite_p(VALUE num)
{
    double value = RFLOAT_VALUE(num);

#ifdef HAVE_ISFINITE
    if (!isfinite(value))
        return Qfalse;
#else
    if (isinf(value) || isnan(value))
        return Qfalse;
#endif

    return Qtrue;
}

floor([ndigits]) → integer or float

إعادة أكبر رقم أصغر من أو يساوي float مع دقة ndigits رقم عشري (القيمة الافتراضية: 0).

عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.

إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.

1.2.floor      #=> 1
2.0.floor      #=> 2
(-1.2).floor   #=> -2
(-2.0).floor   #=> -2

1.234567.floor(2)   #=> 1.23
1.234567.floor(3)   #=> 1.234
1.234567.floor(4)   #=> 1.2345
1.234567.floor(5)   #=> 1.23456

34567.89.floor(-5)  #=> 0
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

يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:

(0.3 / 0.1).floor  #=> 2 (!)

hash → integer

إعادة رمز التجزئة لهذا الرقم العشري.

راجع أيضًا Object#hash.

 
               static VALUE
flo_hash(VALUE num)
{
    return rb_dbl_hash(RFLOAT_VALUE(num));
}

infinite? → -1, 1, or nil

إعادة nil أو ‎-1، أو 1 اعتمادًا علي ما إذا كانت القيمة محدودة، أو ‎-Infinity، أو ‎+Infinity.

(0.0).infinite?        #=> nil
(-1.0/0.0).infinite?   #=> -1
(+1.0/0.0).infinite?   #=> 1

inspect()‎

اسم المستعار لـ to_s

magnitude → float

إعادة القيمة المطلقة للتابع float.

(-34.56).abs   #=> 34.56
-34.56.abs     #=> 34.56
34.56.abs      #=> 34.56

‎#magnitude اسم مستعار للتابع ‎#abs.

               VALUE
rb_float_abs(VALUE flt)
{
    double val = fabs(RFLOAT_VALUE(flt));
    return DBL2NUM(val);
}

modulo(other) → float

إعادة الوحدة بعد قسمة float على other.

6543.21.modulo(137)      #=> 104.21000000000004
6543.21.modulo(137.24)   #=> 92.92999999999961

nan? → true or false

إعادة true إذا كان float عدد نقطة عائمة IEEE غير صالح.

empty? → true or false

إعادة true إذا كان float أقل من 0.

next_float → float

إعادة عدد النقطة العائمة القابل للتمثيل التالي.

Float::MAX.next_float و Float::INFINITY.next_float هما Float::INFINITY.

Float::NAN.next_float هو Float::NAN.

فعلى سبيل المثال:

numerator → integer

إعادة البسط. والنتيجة تعتمد على الآلة.

انظر أيضا ‎#denominator.

phase → 0 or float

إعادة 0 إذا كانت القيمة موجبة، أو "ط (pi)" خلاف ذلك.

positive? → true or false

إعادة true إذا كان float أكبر من 0.

prev_float → float

إعادة عدد النقطة العائمة القابل للتمثيل السابق.

‎(-Float::MAX).prev_float و ‎(-Float::INFINITY).prev_float هما ‎-Float::INFINITY.

Float::NAN.prev_float هو Float::NAN.

فعلى سبيل المثال:

quo(numeric) → float

إعادة float / numeric، مثل Float#/‎.

rationalize([eps]) → rational

إعادة تقريب ابسط للقيمة (flt-|eps| <= result <= flt+|eps|). إذا لم يتاح الوسيط الاختياري eps، سيُختار تلقائيًا.

انظر أيضا ‎#to_r.

round([ndigits] [, half: mode]) → integer or float

إعادة float مُقرَّب إلى أقرب قيمة بدقة أرقام عشرية مقدارها ndigits (القيمة الافتراضية: 0).

عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.

إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.

إذا أُتيح وسيط الكلمة المفتاحية half الاختياري، ستُقرَّب الأرقام التي تقع في المنتصف بين قيمتين مقرَّبتين ممكنتين وفقًا للوضع mode المُحدَّد الكاسر للعلاقة:

‎:up أو nil: تقريب النصف بعيدًا عن الصفر (الوضع الافتراضي).

‎:down: تقريب النصف باتجاه الصفر.

‎:even: تقريب النصف باتجاه أقرب عدد زوجي.

to_f → self

بما أن float هو بالأصل Float، يُعيد self.

to_i → integer

to_int → integer

إعادة float مبتورًا إلى Integer.

يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:

to_int هو اسم مستعار لـ to_i.

to_int → integer

إعادة float مبتورًا إلى Integer.

يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:

to_int هو اسم مستعار لـ to_i.

to_r → rational

إعادة قيمة نسبية.

ملاحظة: ‎0.3.to_r ليس هي نفسه ‎“0.3”.to_r. وهذا الأخير يعادل ‎"3/10".to_r، ولكن الأول ليس كذلك.

انظر أيضا ‎#rationalize.

to_s → string

إعادة سلسلة تحتوي على تمثيل self. كما هو حال الشكل الثابت أو الأسي لـ float، قد يُعيد الاستدعاء NaN و Infinity و ‎-Infinity.

ويُعيَّن له أيضًا الاسم المستعار: inspect

truncate([ndigits]) → integer or float

إعادة float مبتورًا (نحو الصفر) إلى دقة أرقام عشرية ndigits (القيمة الافتراضية: 0).

عندما تكون الدقة سالبة، تكون القيمة المُعادة عدد صحيح متبوعًا بعدد أصفار مقداره ndigits.abs على الأقل.

إعادة رقم نقطة عائمة عندما يكون ndigits موجبًا، وإلا يُعاد عددٌ صحيحٌ.

يُلاحظ أن الدقة المحدودة للنقطة العائمة الحسابية قد تؤدي إلى نتائج مُدهشة:

zero? → true or false

إعادة true إذا كان float يساوي 0.

مصادر