Avatar billede Lasse Novice
23. april 2002 - 00:32 Der er 12 kommentarer og
1 løsning

decimaltal

hvilken pakke vil I foreslaa hvis man skal arbejde med decimaltal i windows. Jeg kender Math::BigFloat, men denne pakke findes ikke til windows. De tal jeg skal arbejde med er max med 6 decimaler. Jeg skal addere / substrahere 2 tal. Det er det eneste. Nogen der har en god pakke?
Avatar billede erikjacobsen Ekspert
23. april 2002 - 00:47 #1
Du kan bare
  $a=1.234234;
  $b=9292.234;

osv. De er der allerede.
Avatar billede Lasse Novice
23. april 2002 - 00:57 #2
nej, desværre kan jeg ikke det!

Jeg ved ikke hvorfor... Men, jeg henter en MASSE tal ind fra en fil. Derved kommer de ind som tekst. Derefter laver jeg dette forsøg:

print "2.014524" - "2.014523" #er et uddrag

som du nok vil se, giver det et forkert resultat.
Avatar billede eeyore Nybegynder
23. april 2002 - 01:02 #3
Måske kan problemet være, at strengene skal "castes" til floats - det burde kunne gøres ala således (uden at have testet det):

print "2.014524"*1 - "2.014523"*1 #er et uddrag
Avatar billede Lasse Novice
23. april 2002 - 01:07 #4
uden at jeg har prøvet dit eksempel, skulle jeg ikke mene at det virker, da dette heller ikke virker:

print 1-0.999999æ

Men jeg har fundet en løsning som kan komme udenom problemet. Jeg er dog rimelig sikker paa at den er laangsom, idet jeg har millioner af tal der skal processeres. Derfor ville det være fedt med en anden løsning. Den jeg har fundet indtil videre, tager brug af modulet Math::Round således:

use Math::Round;
print nearest(.000001, "1"-"0.999999");
Avatar billede eeyore Nybegynder
23. april 2002 - 01:19 #5
Hmmm... har lige lavet lidt tests... dette virker for mig - virker det for dig?  (skal siges, at det er testet på en UNIX-maskine...)

#!/usr/bin/perl

$c1 = "2.014524";
$c2 = "2.014523";
$res = $c1-$c2;

print ($res);
print "\n";
Avatar billede Lasse Novice
23. april 2002 - 01:22 #6
desvaerre virker det ikke hos mig. Det foregaar paa en windows maskine, og der virker det ikke. Det har sikkert noget med C compileren at goere kunne jeg forestille mig.
Avatar billede erikjacobsen Ekspert
23. april 2002 - 07:03 #7
Vil du påstå at den prpræcise kode, som eeyore har givet dig ikke
virker i din Perl på din Windows? Det tror jeg ikke på.

Det du skal lave, kan sagtens laves med indbyggede kommatal i Perl.

Hvorfor bruger du Perl hvis du ikke ved hvordan det skal laves.
Avatar billede Lasse Novice
23. april 2002 - 16:19 #8
JA, erikjacobsen, jeg vil med 100% sikkerhed sige at det eksempel IKKE vil virke. Her har du et screenshoot, saa du evt. kan tro mine ord:

C:\DOCUME~1\LASSEJ~1>perl
$c1 = "2.014524";
$c2 = "2.014523";
$res = $c1-$c2;

print ($res);
print "\n";
^D
1.00000000013978e-006

Som du nok kan se, virker det IKKE.

Mht. din kommentar om brug af perl og min viden indenfor dette omraade, saa kan jeg kun sige, at jeg til fulde er kyndig indenfor perl.

En sidste ting. Jeg troede ikke jeg skulle hoere en saa spydig kommentar fra dig erikjacobsen. Jeg har flere gange haft kontakt med dig, og aldrig set denne side af dig. Jeg skriver dette som et problem - jeg proever skam ikke at lyve over for dig!
Avatar billede eeyore Nybegynder
23. april 2002 - 16:51 #9
Hmm... jeg tror, vist jeg har sovet. Nu ser jeg, det er præcisionsfejlen, der generer dig. Ja, det er præcis det samme resultat i UNIX, og med Math::BigFloat giver det ganske rigtigt 1E-6 som det bør.

Men eftersom du ved, du kun skal operere med max 6 decimaler, kan du jo "tvinge" perl til at operere med en præcision på 6 decimaler på følgende måde:

#!/usr/bin/perl

$c1 = "2.014524";
$c2 = "2.014523";
$res = $c1-$c2;

$res *=1e6;
$res = int($res);
$res /=1e6;

print ($res);
print "\n";
Avatar billede erikjacobsen Ekspert
23. april 2002 - 16:55 #10
Spydig. Ok da. Men jeg havde mine tvivl da du ikke vil acceptere brugen
af almindelig kommatal.
Avatar billede Lasse Novice
23. april 2002 - 18:21 #11
ja, og derefter "printe" til en fil med printf eftersom det skal ud i en fil....

takker eeyore
Avatar billede Lasse Novice
23. april 2002 - 18:21 #12
ja, og derefter "printe" til en fil med printf eftersom det skal ud i en fil(med normal notation - ikke scientific notation)....
Avatar billede erikjacobsen Ekspert
23. april 2002 - 18:27 #13
Skal man have udskrifter med fast antal decimaler anbefaler jeg nu brugen af printf:

printf("%1.6f\n",23.24234234324);
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester