Peter: 2 - 2 <> 0 !???

Ich hab da mal so ne Frage:

my $zahl = 2;
  my $zahl_int = int($zahl);
  my $erg = $zahl - $zahl_int;
  print "$zahl - $zahl_int = $erg\n";

Er schreibt '2 - 2 = 8.88178419700125e-016' das ist aber nich 0!!! Zwar fast, aber nicht wirklich. Zum rechnen muss ich aber mit

if($erg == 0) { ... }

feststellen, ob $erg null ist -- und das ist in diesem Fall leider nicht der Fall (obwol es logisch ist das 2 - 2 = 0 !!!)

  1. use Mosche; # Begrüssungen werden hier gerne gesehen

    my $zahl = 2;
      my $zahl_int = int($zahl);
      my $erg = $zahl - $zahl_int;
      print "$zahl - $zahl_int = $erg\n";

    Bei mir kommt der Text
    2 - 2 = 0
    raus.

    Hast du dir mal 'perldoc -f int' angesehen?
    "You should not use this function for rounding: one because it truncates towards 0..."

    use Tschoe qw(Matti); # und das ist eine Verabschiedung

    1. Hi,

      use Mosche; # Begrüssungen werden hier gerne gesehen

      Mosche -> müsste das nicht Morsche mit r heißen? bei Mosche denk ich immer gleich an eine islamische Kirche.

      my $zahl = 2;
        my $zahl_int = int($zahl);
        my $erg = $zahl - $zahl_int;

      Mag sein das $zahl nun als Gleitkommawert gesehen wird, und deshalb dieser kleine Fehler entsteht. Deshlab würd ich von vorn herein Gleitkommas und Ganzzahlen als solche festlegen.

      Hast du dir mal 'perldoc -f int' angesehen?
      "You should not use this function for rounding: one because it truncates towards 0..."

      Das sollte glaub ich nur darauf hinweisen das int() immer nach 0 hin abschneidet und deshalb nicht mathematisch korrekt rundet, oder?

      use Tschoe qw(Matti); # und das ist eine Verabschiedung

      Gruß

      ueps

      ps:

      Hast du eigentlich ein wenig zuviel Pascal bzw. Delphi geproggt oder warum ständig dieses use ...?
      Und was soll qw(Matti) bedeuten?

      1. Hallo,

        Das sollte glaub ich nur darauf hinweisen das int() immer nach 0 hin
        abschneidet und deshalb nicht mathematisch korrekt rundet, oder?

        Richtig.

        Hast du eigentlich ein wenig zuviel Pascal bzw. Delphi geproggt oder warum
        ständig dieses use ...?

        'use' ne 'uses'.
        perldoc -f use

        Und was soll qw(Matti) bedeuten?

        Dass das Symbol 'Matti' importiert werden soll.

        Gruesse,
         CK

        1. Hi,

          'use' ne 'uses'.

          Jo stimmt, da hab ich was verwechselt. Hab mich auch schon länger nicht mehr mit den guten alten Pascal Slang rumgeschlagen.

          perldoc -f use

          Und was soll qw(Matti) bedeuten?

          Dass das Symbol 'Matti' importiert werden soll.

          Dann hat er halt ein wenig zuviel in Perl geproggt ;-)

          Gruß

          ueps

  2. Aloha!

    Zum rechnen muss ich aber mit

    if($erg == 0) { ... }

    feststellen, ob $erg null ist -- und das ist in diesem Fall leider nicht der Fall (obwol es logisch ist das 2 - 2 = 0 !!!)

    Es ist ein altbekanntes Problem, dass Rechner mit Gleitkommazahlen zwar rechnen können, dabei aber zumeist Rundungsfehler entstehen.

    Das ist im Normalfall nicht weiter schlimm (obwohl man dennoch vermeiden sollte, auf das exakte Treffen eines Wertes zu hoffen), aber wenn sich der Wert nahe Null bewegt, entstehen zusätzliche Möglichkeiten, die Zahl immer kleiner werden zu lassen, immer näher an Null heranzuführen, aber Null selbst niemals zu erreichen.

    Auf deutsch: Entweder rechtest du mit Integer-Werten (und wenn du Währungen verwendest, rechne in Pfen^H^H^H^HEuroCent und dividiere zur Ausgabe durch 100) - dann hast du keine Rundungsfehler. Oder du subtrahierst zwei annähernd gleich große Zahlen und prüfst nicht, ob sie gleich Null sind, sondern ob die Differenz kleiner als ein recht kleiner Wert ist (also nahe Null).

    if ($zahl1 - $zahl 2 < 0.0000000001){ //Zahlen sind fast gleich groß }

    - Sven Rautenberg