Schrift
[thread]12663[/thread]

Illegal modulus zero: auch bei 0 vor dem komma

Leser: 1


<< >> 8 Einträge, 1 Seite
MatthiasW
 2008-10-21 17:33
#115675 #115675
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Mir ist gerade mal aufgefallen, dass der Modulo(%) das Programm beendet, wenn auf der rechten Seite eine 0 vorm Komma steht, die Modulooperation aber eigentlich möglich ist:
Code (perl): (dl )
perl -e "print 1 % 0.3"

Sollte eigentlich 0.1 ausgeben, man bekommt aber die "Illegal modulus zero" Meldung.

Gibt es da noch andere Möglichkeiten soetwas zu vermeiden, außer die Zahlen vorher mit einem Vielfachen von 10 zu multiplizieren und danach wieder entsprechend oft zu dividieren?

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Gast Gast
 2008-10-21 17:44
#115676 #115676
% funktioniert nur mit Ganzzahlen (Integers).
Die 0.3 wird in dem Zusammehang automatisch zu einem Integer konvertiert .


~ perl -e"print int 0.3"
0
~

Und 0.3 ist eben dann 0 wie du siehst.

//EDIT:
Ansonsten steht zu %:
Quote
If the operands $a and $b are floating point values and the absolute value of $b (that is abs($b)) is less than (UV_MAX + 1) , only the integer portion of $a and $b will be used in the operation (Note: here UV_MAX means the maximum of the unsigned integer type). If the absolute value of the right operand (abs($b)) is greater than or equal to (UV_MAX + 1) , "%" computes the floating-point remainder $r in the equation ($r = $a - $i*$b) where $i is a certain integer that makes $r should have the same sign as the right operand $b (not as the left operand $a like C function fmod() ) and the absolute value less than that of $b .
pq
 2008-10-21 17:52
#115677 #115677
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
das ist natürlich eine komische meldung, wenn es keine null ist, aber wofür braucht
man modulo 0 komma irgendwas?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
MatthiasW
 2008-10-21 19:03
#115679 #115679
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
pq+2008-10-21 15:52:43--
das ist natürlich eine komische meldung, wenn es keine null ist, aber wofür braucht
man modulo 0 komma irgendwas?

Ich berechne mir $rhs vor einer Schleife in der ich falls $lhs % $rhs == 0 speziellen Code ausführe.

$lhs ist in diesem Fall einfach ein Zähler der von 1 bis $max raufzählt.
$rhs berechne ich aus einem gegebenen Winkel(!=0): $rhs = 0.035 / $angle;

So wird bei größerem Winkel öfter der Code ausgeführt als bei kleinem.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
Ishka
 2008-10-22 00:16
#115683 #115683
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Du könntest den Modulo auch so berechnen:
Code (perl): (dl )
1
2
3
my $x=1;
my $m=0.3;
print $x-int($x/$m)*$m;
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
MatthiasW
 2008-10-22 16:56
#115691 #115691
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Vielen Dank Ishka, habs jetzt so eingebaut.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
LanX-
 2008-10-22 21:53
#115703 #115703
User since
2008-07-15
1000 Artikel
BenutzerIn

user image
MatthiasW+2008-10-21 17:03:42--
Ich berechne mir $rhs vor einer Schleife in der ich falls $lhs % $rhs == 0 speziellen Code ausführe.


Matthias, IMHO ist der Ansatz recht unglücklich ...

Wie willst du z.B. bei der Floatdarstellung von 1/3 sicherstellen das 1 % 0.333333 == 0 ist ?
Deswegen macht es ja nur Sinn nur Ganzzahlen zuzulassen!

Dann lieber gleich beide Seiten mit dem Nenner Multiplizieren, weil immer 3 %1 == 0 gilt.

Oder du musst die Fehlerunschärfe mit einbeziehen.
MatthiasW
 2008-10-23 19:49
#115731 #115731
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Die Genauigkeit reicht mir im Moment, aber danke für den Einwand!

Das Problem mit der Ungenauigkeit verfolgt nun mal jeden, der am Computer rechnet, und käme es auf Genauigkeit an, hätte ich einen anderen Ansatz gewählt.
In meinem Fall ist es aber legitim diese Ungenauigkeiten in Kauf zu nehmen.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
<< >> 8 Einträge, 1 Seite



View all threads created 2008-10-21 17:33.