الفرق بين المراجعتين ل"Ruby/Float/next float"
اذهب إلى التنقل
اذهب إلى البحث
جميل-بيلوني (نقاش | مساهمات) (إنشاء الصفحة.) |
جميل-بيلوني (نقاش | مساهمات) |
||
سطر 3: | سطر 3: | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby Float]] | [[تصنيف: Ruby Float]] | ||
− | يعيد التابع <code>next_float</code> العدد | + | يعيد التابع <code>next_float</code> العدد العشري الذي يلي العدد العشري الذي استُدعي معه. |
+ | استدعاء التابع <code>next_float</code> مع القيمة الثابتة <code>Float::MAX</code> و <code>Float::INFINITY</code> يعيد القيمة <code>Float::INFINITY</code> الثابتة. | ||
+ | |||
+ | استدعاء التابع بالشكل <code>Float::NAN.next_float</code> يعيد القيمة <code>Float::NAN</code>. | ||
==البنية العامة== | ==البنية العامة== | ||
− | <syntaxhighlight lang="ruby"> | + | <syntaxhighlight lang="ruby">next_float → float</syntaxhighlight> |
==القيمة المعادة== | ==القيمة المعادة== | ||
− | يعاد | + | يعاد العدد العشري الذي يلي العدد العشري المعطى. |
==أمثلة== | ==أمثلة== | ||
− | مثال على استخدام التابع <code> | + | مثال على استخدام التابع <code>next_float</code>: |
− | <syntaxhighlight lang="ruby">1. | + | <syntaxhighlight lang="ruby">0.01.next_float #=> 0.010000000000000002 |
− | + | 1.0.next_float #=> 1.0000000000000002 | |
− | 1. | + | 100.0.next_float #=> 100.00000000000001 |
− | (- | + | |
− | + | 0.01.next_float - 0.01 #=> 1.734723475976807e-18 | |
+ | 1.0.next_float - 1.0 #=> 2.220446049250313e-16 | ||
+ | 100.0.next_float - 100.0 #=> 1.4210854715202004e-14 | ||
+ | |||
+ | f = 0.01; 20.times { printf "%-20a %s\n", f, f.to_s; f = f.next_float } | ||
+ | #=> 0x1.47ae147ae147bp-7 0.01 | ||
+ | # 0x1.47ae147ae147cp-7 0.010000000000000002 | ||
+ | # 0x1.47ae147ae147dp-7 0.010000000000000004 | ||
+ | # 0x1.47ae147ae147ep-7 0.010000000000000005 | ||
+ | # 0x1.47ae147ae147fp-7 0.010000000000000007 | ||
+ | # 0x1.47ae147ae148p-7 0.010000000000000009 | ||
+ | # 0x1.47ae147ae1481p-7 0.01000000000000001 | ||
+ | # 0x1.47ae147ae1482p-7 0.010000000000000012 | ||
+ | # 0x1.47ae147ae1483p-7 0.010000000000000014 | ||
+ | # 0x1.47ae147ae1484p-7 0.010000000000000016 | ||
+ | # 0x1.47ae147ae1485p-7 0.010000000000000018 | ||
+ | # 0x1.47ae147ae1486p-7 0.01000000000000002 | ||
+ | # 0x1.47ae147ae1487p-7 0.010000000000000021 | ||
+ | # 0x1.47ae147ae1488p-7 0.010000000000000023 | ||
+ | # 0x1.47ae147ae1489p-7 0.010000000000000024 | ||
+ | # 0x1.47ae147ae148ap-7 0.010000000000000026 | ||
+ | # 0x1.47ae147ae148bp-7 0.010000000000000028 | ||
+ | # 0x1.47ae147ae148cp-7 0.01000000000000003 | ||
+ | # 0x1.47ae147ae148dp-7 0.010000000000000031 | ||
+ | # 0x1.47ae147ae148ep-7 0.010000000000000033 | ||
+ | |||
+ | f = 0.0 | ||
+ | 100.times { f += 0.1 } | ||
+ | f #=> 9.99999999999998 # should be 10.0 in the ideal world. | ||
+ | 10-f #=> 1.9539925233402755e-14 # the floating point error. | ||
+ | 10.0.next_float-10 #=> 1.7763568394002505e-15 # 1 ulp (unit in the last place). | ||
+ | (10-f)/(10.0.next_float-10) #=> 11.0 # the error is 11 ulp. | ||
+ | (10-f)/(10*Float::EPSILON) #=> 8.8 # approximation of the above. | ||
+ | "%a" % 10 #=> "0x1.4p+3" | ||
+ | "%a" % f #=> "0x1.3fffffffffff5p+3" # the last hex digit is 5. 16 - 5 = 11 ulp.</syntaxhighlight> | ||
==انظر أيضا== | ==انظر أيضا== | ||
− | * التابع <code>[[Ruby/Float/ | + | * التابع <code>[[Ruby/Float/prev float|prev_float]]</code>: يعيد العدد العشري الذي يسبق العدد العشري الذي استُدعي معه. |
==مصادر== | ==مصادر== | ||
− | *[http://ruby-doc.org/core-2.5.1/ | + | *[http://ruby-doc.org/core-2.5.1/Float.html#method-i-next_float قسم التابع next في الصنف Float في توثيق روبي الرسمي.] |
مراجعة 07:26، 24 نوفمبر 2018
يعيد التابع next_float
العدد العشري الذي يلي العدد العشري الذي استُدعي معه.
استدعاء التابع next_float
مع القيمة الثابتة Float::MAX
و Float::INFINITY
يعيد القيمة Float::INFINITY
الثابتة.
استدعاء التابع بالشكل Float::NAN.next_float
يعيد القيمة Float::NAN
.
البنية العامة
next_float → float
القيمة المعادة
يعاد العدد العشري الذي يلي العدد العشري المعطى.
أمثلة
مثال على استخدام التابع next_float
:
0.01.next_float #=> 0.010000000000000002
1.0.next_float #=> 1.0000000000000002
100.0.next_float #=> 100.00000000000001
0.01.next_float - 0.01 #=> 1.734723475976807e-18
1.0.next_float - 1.0 #=> 2.220446049250313e-16
100.0.next_float - 100.0 #=> 1.4210854715202004e-14
f = 0.01; 20.times { printf "%-20a %s\n", f, f.to_s; f = f.next_float }
#=> 0x1.47ae147ae147bp-7 0.01
# 0x1.47ae147ae147cp-7 0.010000000000000002
# 0x1.47ae147ae147dp-7 0.010000000000000004
# 0x1.47ae147ae147ep-7 0.010000000000000005
# 0x1.47ae147ae147fp-7 0.010000000000000007
# 0x1.47ae147ae148p-7 0.010000000000000009
# 0x1.47ae147ae1481p-7 0.01000000000000001
# 0x1.47ae147ae1482p-7 0.010000000000000012
# 0x1.47ae147ae1483p-7 0.010000000000000014
# 0x1.47ae147ae1484p-7 0.010000000000000016
# 0x1.47ae147ae1485p-7 0.010000000000000018
# 0x1.47ae147ae1486p-7 0.01000000000000002
# 0x1.47ae147ae1487p-7 0.010000000000000021
# 0x1.47ae147ae1488p-7 0.010000000000000023
# 0x1.47ae147ae1489p-7 0.010000000000000024
# 0x1.47ae147ae148ap-7 0.010000000000000026
# 0x1.47ae147ae148bp-7 0.010000000000000028
# 0x1.47ae147ae148cp-7 0.01000000000000003
# 0x1.47ae147ae148dp-7 0.010000000000000031
# 0x1.47ae147ae148ep-7 0.010000000000000033
f = 0.0
100.times { f += 0.1 }
f #=> 9.99999999999998 # should be 10.0 in the ideal world.
10-f #=> 1.9539925233402755e-14 # the floating point error.
10.0.next_float-10 #=> 1.7763568394002505e-15 # 1 ulp (unit in the last place).
(10-f)/(10.0.next_float-10) #=> 11.0 # the error is 11 ulp.
(10-f)/(10*Float::EPSILON) #=> 8.8 # approximation of the above.
"%a" % 10 #=> "0x1.4p+3"
"%a" % f #=> "0x1.3fffffffffff5p+3" # the last hex digit is 5. 16 - 5 = 11 ulp.
انظر أيضا
- التابع
prev_float
: يعيد العدد العشري الذي يسبق العدد العشري الذي استُدعي معه.