Thread Richtig INTen (14 answers)
Opened by bianca at 2009-12-24 09:27

bianca
 2009-12-24 09:27
#129639 #129639
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
Erstmal fettes FROHE WEIHNACHTEN an alle!
Und dann noch ein kleines Problemchen wo ich um Hilfe bitte.
Ich möchte Werte richtig "INTen" und zwar nicht mit int(), denn das macht nicht immer, was ich möchte.

Mein Versuchsaufbau:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
my $sub = 'integer1';
my $space = '.' x 25;
my ($int,$erwartet);
foreach my $test        (
                                                .57 * 100,'=57',
                                                .58,'=0',
                                                12.345,'=12',
                                                57.00000000000000001,'=57',
                                                0.000000000000001,'=0',
                                                1.01205,'=1',
                                                -0.903,'=0',
                                                -1.999999999999999,'=-1'
                                        ) {
        if (substr ($test,0,1) eq '=') {
                $erwartet = substr ($test,1);
                print " " . ($int eq $erwartet ? ' OK' : " FEHLER! Erwartet \'$erwartet\'") . "\n";
        }
        else {
                $int = &{$sub} ($test);
                print "\'$test\'" . substr ($space,0,25 - length ($test)) . "geINTet: \'$int\'" . substr ($space,0,25 - length ($int));
        }
}


Testfall Perl's int():
Code (perl): (dl )
1
2
3
sub intperl {
        return int($_[0]);
}


Ergibt:
Code: (dl )
1
2
3
4
5
6
7
8
'57'.......................geINTet: '56'.......................  FEHLER! Erwartet '57'
'0.58'.....................geINTet: '0'........................ OK
'12.345'...................geINTet: '12'....................... OK
'57'.......................geINTet: '57'....................... OK
'1e-015'...................geINTet: '0'........................ OK
'1.01205'..................geINTet: '1'........................ OK
'-0.903'...................geINTet: '0'........................ OK
'-2'.......................geINTet: '-1'....................... OK


Macht Fehler bei .57 * 100 und vermutlich auch noch bei anderen Berechnungen.

Testfall integer1:
Code (perl): (dl )
1
2
3
4
5
6
7
sub integer1 {
        my $wert = shift ( @_ ) || 0;
        if ($wert =~ /^([^\.]*)\.([^\.]+)$/) {
                $wert = $1;
        }
        return $wert + 0;
}


Ergibt:
Code: (dl )
1
2
3
4
5
6
7
8
'57'.......................geINTet: '57'.......................  OK
'0.58'.....................geINTet: '0'........................ OK
'12.345'...................geINTet: '12'....................... OK
'57'.......................geINTet: '57'....................... OK
'1e-015'...................geINTet: '1e-015'................... FEHLER! Erwartet '0'
'1.01205'..................geINTet: '1'........................ OK
'-0.903'...................geINTet: '0'........................ OK
'-2'.......................geINTet: '-2'....................... FEHLER! Erwartet '-1'


Macht also Fehler bei -1.999999999999999 und 0.000000000000001.

Und die gleichen Fehler habe ich bei diesem Ansatz:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub integer2 {
        my $wert = shift ( @_ ) || 0;
        if ($wert =~ /\./) {
                my $neu = '';
                for (my $st = 0; $st < length($wert); $st ++) {
                        if (substr($wert,$st,1) eq '.') { last; }
                        else { $neu .= substr($wert,$st,1); }
                }
                $neu = 0 if $neu eq '';
                $wert = $neu;
        }
        return $wert + 0;
}


Hat jemand noch Ideen, wie ich alle drei Fälle "fehlerfrei" inten kann?

Danke und frohes Fest!
Last edited: 2009-12-24 09:28:04 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Richtig INTen