با سلام
من یک سری عدد بین یک تا 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
واقعا برام عجیب بود که یک کد به این سادگی (که فقط یک جمع توش داره) با دقت مناسبی اجرا نمیشه.
از دوستان کسی در این زمینه نظری نداره؟