What is causing the ARITHMETIC exception in my FORTRAN program?

  • Context: Fortran 
  • Thread starter Thread starter debbieanne
  • Start date Start date
  • Tags Tags
    Arithmetic Fortran
Click For Summary
SUMMARY

The ARITHMETIC exception in the FORTRAN program is caused by a division by zero in the expression SAREA(2,ISN)=SAREA(2,ISN)/IND(13)/1000./6080.2*IND(12)/1000.. The variable IND(13) was found to be zero, leading to the SIGFPE signal during execution. Simplifying the expression into multiple lines helped identify the exact point of failure, confirming that SAREA(2,ISN) was being accessed out of bounds. The solution involved checking the value of ISN to ensure it was within the valid range of the SAREA array.

PREREQUISITES
  • Understanding of FORTRAN programming language
  • Familiarity with debugging tools like gdb
  • Knowledge of array bounds and indexing in programming
  • Basic concepts of arithmetic operations and exceptions
NEXT STEPS
  • Learn how to use gdb effectively for debugging FORTRAN programs
  • Investigate array bounds checking techniques in FORTRAN
  • Explore error handling strategies for arithmetic exceptions in programming
  • Study the implications of division by zero in numerical computations
USEFUL FOR

FORTRAN developers, software engineers debugging numerical applications, and anyone troubleshooting arithmetic exceptions in programming environments.

debbieanne
Messages
12
Reaction score
1
Good day. My FORTRAN program is throwing an ARITHMETIC exception on this line of code:

SAREA(2,ISN)=SAREA(2,ISN)/IND(13)/1000./6080.2*IND(12)/1000.

When I check this using gdb and print the contents of the variable SAREA(2,ISN), the value is 1432.
gdb error message:
Program received signal SIGFPE, Arithmetic exception.
0x00000001004330ff in anal2 (sdata1=..., alpha=..., code=..., n2=..., nl2=14)
at aix_anal2.f:66
66 13 SAREA(2,ISN)=SAREA(2,ISN)/IND(13)/1000./6080.2*IND(12)/1000.
(gdb) bt
#0 0x00000001004330ff in anal2 (sdata1=..., alpha=..., code=..., n2=...,
nl2=14) at aix_anal2.f:66
#1 0x000000010042594a in set2 (alpha=...) at aix_set2.f:252
#2 0x0000000100412024 in setup () at aix_setup.f:58
#3 0x0000000100445fc7 in test_driver_y2k () at aix_test_driver_y2k.f:338
#4 0x00000001004460a1 in main (argc=1, argv=0x60003a180)
at aix_test_driver_y2k.f:344
#5 0x00000001800483cd in _cygwin_exit_return ()
at /usr/src/debug/cygwin-2.2.1-1/winsup/cygwin/dcrt0.cc:1047
#6 0x00000001800460dc in _cygtls::call2 (this=0x22ce00,
func=0x180047420 <dll_crt0_1(void*)>, arg=0x0, buf=buf@entry=0x22ccf0)
at /usr/src/debug/cygwin-2.2.1-1/winsup/cygwin/cygtls.cc:111
#7 0x0000000180046174 in _cygtls::call (func=<optimized out>,
arg=<optimized out>)
at /usr/src/debug/cygwin-2.2.1-1/winsup/cygwin/cygtls.cc:30
#8 0x00000001004462e1 in cygwin_crt0 (f=<optimized out>)
at /usr/src/debug/cygwin-2.2.1-1/winsup/cygwin/lib/cygwin_crt0.c:22
#9 0x0000000100401010 in mainCRTStartup ()
at /usr/src/debug/cygwin-2.2.1-1/winsup/cygwin/crt0.c:29
(gdb)

This line of code is also causing a stack dump. I tried coding for division by zero but I still get the same stack dump and gdb error message. Any suggestions?

Thanks
 
Technology news on Phys.org
My first attempt would be to simplify the expression into several lines:
Fortran:
print ISN
print SAREA(2,ISN)

X13=IND(13)
X12=IND(12)
Y = SAREA(2,ISN) / X13
Y = Y / 1000.0
Y = Y / 6080.2
Y = Y * X12
Y = Y / 1000
SAREA(2,ISN) = Y

This allows you to see where the point of failure is. My suspicion is that SAREA(2,ISN) is outside the AREA array so I'd also print the value of ISN and verify that SAREA(2,ISN) exists or is within range of your array bounds.
 
  • Like
Likes   Reactions: FactChecker
Thanks jedishrfu. This worked. I was able to determine that Y = SAREA(2,ISN) / X13 was the culprit. X13 =0...division by zero problem. Thanks so much. Very much appreciated.
 
  • Like
Likes   Reactions: jedishrfu

Similar threads

  • · Replies 9 ·
Replies
9
Views
10K
Replies
2
Views
3K