วิธีการตั้งค่าความแม่นยำสองเท่าใน Fortran


10

เมื่อเร็ว ๆ นี้ฉันได้พบกับปัญหาที่แปลกประหลาดกับ FORTRAN95 ฉันเริ่มต้นตัวแปร X และ Y ดังนี้

X=1.0
Y=0.1

หลังจากนั้นฉันเพิ่มเข้าด้วยกันและพิมพ์ผลลัพธ์:

1.10000000149012

หลังจากตรวจสอบตัวแปรดูเหมือนว่า 0.1 จะไม่ถูกแสดงในความแม่นยำสองเท่าพร้อมความแม่นยำเต็มรูปแบบ มีวิธีหลีกเลี่ยงปัญหานี้หรือไม่?

คำตอบ:


21

อีกวิธีในการทำเช่นนี้คือการระบุความแม่นยำที่คุณต้องการในตัวแปรอย่างชัดเจนโดยใช้SELECTED_REAL_KIND intrinsic จากนั้นใช้สิ่งนี้เพื่อกำหนดและเริ่มต้นตัวแปร สิ่งที่ต้องการ:

INTEGER, PARAMETER :: dp = SELECTED_REAL_KIND(15)
REAL(dp) :: x
x = 1.0_dp

ข้อดีที่ดีในการทำเช่นนี้คือคุณสามารถเก็บคำจำกัดความของdpในโมดูลจากนั้นUSEโมดูลนั้นในกรณีที่จำเป็น ตอนนี้ถ้าคุณต้องการเปลี่ยนความแม่นยำของโปรแกรมของคุณคุณจะต้องเปลี่ยนคำจำกัดความdpในที่เดียวแทนการค้นหาและแทนที่D0s ทั้งหมดเมื่อสิ้นสุดการกำหนดค่าเริ่มต้นตัวแปรของคุณ (นี่คือสาเหตุที่ฉันไม่แนะนำให้ใช้1.0D-1ไวยากรณ์เพื่อกำหนด Y ตามที่แนะนำทำงานได้ แต่ทำให้ยากต่อการค้นหาและเปลี่ยนอินสแตนซ์ทั้งหมดในอนาคต)

หน้านี้ใน Fortran SELECTED_REAL_KINDวิกิพีเดียให้ข้อมูลเพิ่มเติมบางอย่างที่ดีใน


ถูกต้องนี่ควรเป็นแนวทางมาตรฐาน
OndřejČertík

และบ่อยครั้งที่คนต้องเปลี่ยนความแม่นยำในโปรแกรมของพวกเขาสุ่มสี่สุ่มห้าโดยไม่ต้องทำตามขั้นตอนและทำการทดสอบ? เหตุผลหลักในการใช้_dpโครงร่างคือเพื่อให้ความแม่นยำถูกกำหนดไว้อย่างชัดเจนในแบบพกพา
ja72

12

คุณประกาศตัวแปรเป็นความแม่นยำสองเท่า แต่คุณเริ่มต้นได้ด้วยค่าความแม่นยำเดียว

คุณสามารถเขียนได้:

X=1.0d0
Y=1.0d-1

คำตอบของ Barronด้านล่างเป็นอีกวิธีหนึ่งในการสร้างความแม่นยำสองเท่าที่แท้จริงด้วยข้อได้เปรียบที่ช่วยให้คุณสามารถเปลี่ยนความแม่นยำของตัวแปรของคุณได้ในภายหลัง


1
ฉันคิดว่าควรใช้วิธี 1.0_dp ที่อธิบายไว้ในโพสต์ด้านล่าง
OndřejČertík

1
I second @ ความคิดเห็นของOndřejČertík - คำตอบของ Barron คือคำตอบที่ดีที่สุด
OscarB
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.