انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: ahmadubuntu در 29 آبان 1393، 11:47 ق‌ظ

عنوان: دقت کمپایلر یا دقت پردازنده!
ارسال شده توسط: ahmadubuntu در 29 آبان 1393، 11:47 ق‌ظ
با سلام
من یک سری عدد بین یک تا 50 نیاز داشتم که فاصلشون 0.1 باشه به همین خاطر یک کد فرترن ساده نوشتم که این اعداد رو تولید کنه:
program one
implicit none
real::j
j=1.0
do
    write(*,*)j
    j=j+0.1
    if (j.gt.50) exit
end do

end program one

ولی با کمال تعجب خروجی برنامه دقت خیلی پایینی داشت:

   1.000000
   1.100000
   1.200000
   1.300000
   1.400000
   1.500000
   1.600000
   1.700000
   1.800000
   1.900000
   2.000000
   2.100000
   2.200000
   2.300000
   2.400000
   2.500000
   2.600000
   2.700000
   2.799999
   2.899999
   2.999999
   3.099999
   3.199999
   3.299999
   3.399999
   3.499999
   3.599999
   3.699999
   3.799999
   3.899998
   3.999998
   4.099998
   4.199998
   4.299998
   4.399998
   4.499998
   4.599998
   4.699998
   4.799998
   4.899998
   4.999998
   5.099998
   5.199997
   5.299997
   5.399997
   5.499997
   5.599997
   5.699997
   5.799997
   5.899997
   5.999997
   6.099997
   6.199996
   6.299996
   6.399996
   6.499996
   6.599996
   6.699996

البته کل خروجی رو نذاشتم ولی خب مشت نمونه خرواره!
من این کد رو هم با کمپایلر gfortran و هم با ifort کمپایل کردم!
هم روی لپتاپ خودم و هم روی یک سیستم 24 هسته ای با سی پی یو زیر کمپایل کردم ولی بازم همین ایراد رو داشت:
 Intel(R) Xeon(R) CPU           X5660  @ 2.80GHz
واقعا برام عجیب بود که یک کد به این سادگی (که فقط یک جمع توش داره) با دقت مناسبی اجرا نمیشه.
از دوستان کسی در این زمینه نظری نداره؟
عنوان: پاسخ : دقت کمپایلر یا دقت پردازنده!
ارسال شده توسط: ahmadubuntu در 29 آبان 1393، 03:14 ب‌ظ
با استفاده از r8- در آپشنهای ifort مشکلم حل شد:

ifort -r8 numgen.f90
یعنی دقت نویسنده کد هم مهمه ;-)