Unerwartetes Ergebnis bei Modulo

02/10/2007 - 14:27 von Hendrik Schnepel | Report spam
Hallo Newsgroup,

ich habe gerade in einem Forum eine Frage gelesen, die ich mir selbst
nicht ganz beantworten kann.

Warum werden hier zwei verschiedene Ergebnisse ausgegeben:

hsch@tango perl -le 'print 7382 % 100'
82 (wie erwartet)

hsch@tango perl -le 'print +(73.82 * 100) % 100'
81 (eher ueberraschend?)

Das ganze passiert nur bei bestimmten Kombinationen von Vor- und
Nachkommaziffern. Eine int(...) Anweisung hilft auch nicht weiter.

Was wieder erwartungsgemaess arbeitet, ist:

hsch@tango perl -le 'print +((73.82 * 100)."") % 100'

Aber das ist doch wirklich unschoen...

Kann mir jemand sagen, wie dieser Effekt zustande kommt (ich vermute mal
irgendetwas, das durch interne (floating point?) Darstellung verursacht
wird), und wie man obige Rechnung evtl. besser programmieren koennte?

Gruss,
Hendrik
 

Lesen sie die antworten

#1 Roman Racine
02/10/2007 - 14:48 | Warnen spam
Hendrik Schnepel wrote:

Kann mir jemand sagen, wie dieser Effekt zustande kommt (ich vermute mal
irgendetwas, das durch interne (floating point?) Darstellung verursacht
wird), und wie man obige Rechnung evtl. besser programmieren koennte?



Das kommt durch Floating-Point Arithmetik zustande, d.h. in der
Floatingpoint-Arithmetik ist die Zahl eben nicht ganz 7382, sondern ein
klein wenig weniger.
perl -le 'print int(73.82 * 100)'
gibt nàmlich 7381.

Mit solchen unerwarteten Ergebnissen musst du grundsàtzlich mit jeder
gàngigen Programmiersprache rechnen, wenn du Ganzzahlarithmetik und
Gleitkommaarithmetik mischst. Solange du endliche Pràzision verwendest,
wird man immer ein Beispiel wie das obige konstruieren können, wo die
interne Darstellung gerade ein kleines bisschen weniger als die ganze Zahl
ist.

Mit Math::BigFloat kriegst du das gewünschte Ergebnis. Allerdings àndert es
nichts daran, dass eine Operation wie die von dir vorgeschlagene ziemlich
"unschön" ist, weil sehr unerwartete Ergebnisse rauskommen können.
Möglicherweise gibt es andere Wege, wie du zum gewünschten Ziel kommen
könntest. Das könnte man beurteilen, wenn du uns erklàren würdest, was du
eigentlich genau erreichen willst.

Gruss

Roman°
IRC-Freenode: #usenet-friends
http://www.usenet-friends.ch.vu/

Ähnliche fragen