nobody0
22-05-2002, 23:11
Diese komische Meldung bekomme ich von diesem Programm:
#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <float.h>
#include <values.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#define N 1000000000 // Anzahl der Teilintervalle zur numerischen Berechnung der beiden Intervalle (1e9)
void sig_handler(int sig)
{
printf("Signal %d - program exiting...\n", sig);
exit(0);
}
int main(void)
{
const long double a_0=5.5e-8; // a_D: h/(2*pi*sqrt(0,2 m_e E_D))
const long double w_max=1e8;
const long double n_d=1e20;
const long double dr=1e-13; // Raumschritt-Breite (in m), wobei obere Integrationsgrenzen = dr * N
const long double dt=1e-9; // Zeitschritt: zunächst 1ns (dann 1,5, 2,25, ...)
// (insges. 42 Zeiten, die rund )
FILE *fp = NULL;
long double r=0;
long double t=0;
long double f1=0, f2=0;
signal(SIGHUP, sig_handler);
signal(SIGINT, sig_handler);
signal(SIGQUIT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGTERM, sig_handler);
fp = fopen ("test0.dat", "w+");
if (ferror (fp))
{
perror ("\a can't open output-file\n");
exit (errno);
}
for( t = 0.0 ; t < 0.2 ; t = (t==0.0) ? dt : ( t *= 1.5 ) ) // t=0 ... 0.2s
{
f1=0.0;
f2=0.0;
for(r=dr/2.0;r<N*dr;r+=dr)
{
// Erster Faktor der rechten Seite der Gl. 14
f1 += w_max * expl(-2.0*r/a_0) *expl(-w_max * expl(-2.0*r/a_0) * t)*r*r*dr;
// zweiter Faktor
f2 += ( expl(-w_max * expl(-2.0*r/a_0))*t - 1.0 )*r*r*dr;
}
fprintf(fp,"t= %Le I= %Le\n",t,4*M_PI*n_d*f1*expl(f2*4*M_PI*n_d));
fflush(fp);
fclose(fp);
}
return(0);
} // main
Kompiliert wurde mit dieser Funktion in profile:
function d {
gcc -O2 -D__SMP__ -D_REENTRANT -lm -lvga -Wall -pedantic -ggdb -lefence -o $1 $1.c
}
Und der gdb gibt folgendes aus:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (LWP 22187)]
0x400fa064 in vfprintf () from /lib/libc.so.6
(gdb) list
44 const long double a_0=5.5e-8; // a_D: h/(2*pi*sqrt(0,2 m_e E_D))
45 const long double w_max=1e8;
46 const long double n_d=1e20;
47 const long double dr=1e-13; // Raumschritt-Breite (in m), wobei
obere Integrationsgrenzen = dr * N
48 const long double dt=1e-9; // Zeitschritt: zunächst 1ns (dann
1,5, 2,25, ...)
49 // (insges. 42 Zeiten, die rund )
50
51 FILE *fp = NULL;
52 long double r=0;
53 long double t=0;
(gdb) print f1
$1 = -1172926478
(gdb) print f2
$2 = -560977740
Aber wie kann das sein bei einem Programm ohne Pointer und arrays, dass die äussere for-Schleife auch einmal prolemlos durchläuft?
:confused:
Merkwürdig sind ja auch die Werte von f1 und f2, aber die können ja kein Problem sein, denn notfalls kommt +inf, -inf oder NAN heraus, aber das war bisher kein Problem.
#include <errno.h>
#include <math.h>
#include <stdio.h>
#include <float.h>
#include <values.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#define N 1000000000 // Anzahl der Teilintervalle zur numerischen Berechnung der beiden Intervalle (1e9)
void sig_handler(int sig)
{
printf("Signal %d - program exiting...\n", sig);
exit(0);
}
int main(void)
{
const long double a_0=5.5e-8; // a_D: h/(2*pi*sqrt(0,2 m_e E_D))
const long double w_max=1e8;
const long double n_d=1e20;
const long double dr=1e-13; // Raumschritt-Breite (in m), wobei obere Integrationsgrenzen = dr * N
const long double dt=1e-9; // Zeitschritt: zunächst 1ns (dann 1,5, 2,25, ...)
// (insges. 42 Zeiten, die rund )
FILE *fp = NULL;
long double r=0;
long double t=0;
long double f1=0, f2=0;
signal(SIGHUP, sig_handler);
signal(SIGINT, sig_handler);
signal(SIGQUIT, sig_handler);
signal(SIGFPE, sig_handler);
signal(SIGTERM, sig_handler);
fp = fopen ("test0.dat", "w+");
if (ferror (fp))
{
perror ("\a can't open output-file\n");
exit (errno);
}
for( t = 0.0 ; t < 0.2 ; t = (t==0.0) ? dt : ( t *= 1.5 ) ) // t=0 ... 0.2s
{
f1=0.0;
f2=0.0;
for(r=dr/2.0;r<N*dr;r+=dr)
{
// Erster Faktor der rechten Seite der Gl. 14
f1 += w_max * expl(-2.0*r/a_0) *expl(-w_max * expl(-2.0*r/a_0) * t)*r*r*dr;
// zweiter Faktor
f2 += ( expl(-w_max * expl(-2.0*r/a_0))*t - 1.0 )*r*r*dr;
}
fprintf(fp,"t= %Le I= %Le\n",t,4*M_PI*n_d*f1*expl(f2*4*M_PI*n_d));
fflush(fp);
fclose(fp);
}
return(0);
} // main
Kompiliert wurde mit dieser Funktion in profile:
function d {
gcc -O2 -D__SMP__ -D_REENTRANT -lm -lvga -Wall -pedantic -ggdb -lefence -o $1 $1.c
}
Und der gdb gibt folgendes aus:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1024 (LWP 22187)]
0x400fa064 in vfprintf () from /lib/libc.so.6
(gdb) list
44 const long double a_0=5.5e-8; // a_D: h/(2*pi*sqrt(0,2 m_e E_D))
45 const long double w_max=1e8;
46 const long double n_d=1e20;
47 const long double dr=1e-13; // Raumschritt-Breite (in m), wobei
obere Integrationsgrenzen = dr * N
48 const long double dt=1e-9; // Zeitschritt: zunächst 1ns (dann
1,5, 2,25, ...)
49 // (insges. 42 Zeiten, die rund )
50
51 FILE *fp = NULL;
52 long double r=0;
53 long double t=0;
(gdb) print f1
$1 = -1172926478
(gdb) print f2
$2 = -560977740
Aber wie kann das sein bei einem Programm ohne Pointer und arrays, dass die äussere for-Schleife auch einmal prolemlos durchläuft?
:confused:
Merkwürdig sind ja auch die Werte von f1 und f2, aber die können ja kein Problem sein, denn notfalls kommt +inf, -inf oder NAN heraus, aber das war bisher kein Problem.