Fortran 90 สร้างคำตอบที่ไม่ถูกต้อง สร้าง 0 เมื่อคำตอบควรเป็น 1 ฉันกำลังมองข้ามสิ่งใดไปหรือเปล่า? [ทำซ้ำ]

นี่คือรหัส Fortran 90 ที่ฉันเขียน เป็นฟังก์ชันที่ฉันใช้ในโค้ดที่ใหญ่กว่า แต่ฉันได้รับผลลัพธ์ที่ไม่ถูกต้อง

ฉันรู้ว่าในทางคณิตศาสตร์คำตอบควรเป็น 1 (หรือใกล้เคียงกับ 1 เนื่องจากการคำนวณ) แต่ผลลัพธ์คำตอบของฉันคือ 0

ฉันทำอะไรผิดหรือเปล่า? มีอะไรที่ฉันไม่รู้บ้างไหม?

นี่คือโค้ดของฉันที่บันทึกเป็น test.f90 ที่ฉันกำลังรวบรวมและใช้งานบน windows gfortran:

program main
    implicit none

    real*8 :: y, t

    t = 0.0
    y = (1/3)*exp(5*t) + (2/3)*exp(-t) + t*t*exp(2*t)

    print*, 'y= ', y

end program main

person Oscar Alvarez    schedule 16.02.2020    source แหล่งที่มา
comment
ทำงานได้ดีในการสร้างรหัสทดสอบที่สามารถทำซ้ำได้เล็กน้อย ยินดีต้อนรับสู่ SO!   -  person Ross    schedule 17.02.2020


คำตอบ (1)


fortran ถือว่า 1/3 และ 2/3 เท่ากับศูนย์ คุณควรเพิ่มจุดให้กับตัวเลขของคุณ:

program main
implicit none

real*8 :: y, t

t = 0.0
y = (1./3.)*exp(5*t) + (2./3.)*exp(-t) + t*t*exp(2*t)

print*, 'y= ', y
person Valometrics.com    schedule 16.02.2020
comment
คำตอบนี้ควรขยายออกไปจริงๆ - เหตุใด 1/3 และ 2/3 จึงเท่ากับ 0 และเหตุใดทศนิยมจึงช่วยได้ นอกจากนี้ยังมีรายการที่ซ้ำกันอย่างชัดเจนเพื่อชี้ไปที่... - person Ross; 17.02.2020
comment
นอกจากนี้ 2./3. โดยทั่วไปแล้วจะเป็นจำนวนจริงที่มีความแม่นยำเพียงครั้งเดียว ซึ่งหมายความว่าผลลัพธ์จะคลาดเคลื่อนเมื่อเทียบกับ 2._dp/3._dp โดยที่ dp เป็นประเภทที่เกี่ยวข้อง ไม่แนะนำให้ใช้ *8* - person Ross; 17.02.2020
comment
ดูบทความนี้: math.hawaii.edu/~hile /fortran/fort3.htm#ดับเบิล - person Valometrics.com; 17.02.2020