Hjem Personlig finansiering Et par underlige ting om Java Math - dummies

Et par underlige ting om Java Math - dummies

Indholdsfortegnelse:

Video: String Theory Explained – What is The True Nature of Reality? 2025

Video: String Theory Explained – What is The True Nature of Reality? 2025
Anonim

Tro det eller ej, computere - selv de mest kraftfulde - har visse begrænsninger, når det kommer til at udføre matematiske beregninger. Disse begrænsninger er normalt ubetydelige, men nogle gange sniger de sig op og bider dig. Her er de ting du skal passe på, når du laver matematik i Java.

Integer overløb

Det grundlæggende problem med heltalstyper er, at de har en fast størrelse. Som følge heraf er der en grænse for størrelsen på de tal, der kan gemmes i variabler af typen kort , int eller lang . Selvom lange -variabler kan indeholde tal, der er store, kommer du før eller senere over et tal, der er for stort til at passe ind i en lang variabel.

Okay, overvej dette (admittedly contrived) eksempel:

int a = 1000000000;

System. ud. println (a);

a + = 1000000000;

System. ud. println (a);

a + = 1000000000;

System. ud. println (a);

a + = 1000000000;

System. ud. println (a);

Her forventer du værdien af ​​ a for at blive større efter hver tilføjelse. Men her er det output, der vises:

1000000000

2000000000

-1294967296

-294967296

Den første tilføjelse ser ud til at fungere, men efter dette bliver nummeret negativt! Det skyldes, at værdien har nået størrelsesgrænsen for datatypen int . Desværre siger Java ikke dig, at denne fejl er sket. Den smækker bare int -variablen som fuld af bits som det kan, kasserer det, der ikke passer, og håber, at du ikke mærker. På grund af måden int opbevares negative værdier, bliver store positive værdier pludselig store negative negative værdier.

Historien er, at hvis du arbejder med store heltal, skal du bruge lang i stedet for int , fordi lang kan lagre meget større tal end int . Hvis dine programmer omhandler tal, der er store nok til at være et problem for lang , skal du overveje at bruge floating-point-typer i stedet. Flydende typer kan håndtere endnu større værdier end lang , og de fortæller dig, når du overskrider deres kapacitet.

Floating Point Weirdness

Flydende punktnumre har egne problemer. Til at begynde med opbevares flytende punktnumre ved hjælp af det binære talesystem (base 2), men mennesker arbejder med tal i decimaltalsystemet (base 10). Desværre er nøjagtigt konvertering af tal mellem disse to systemer undertiden umuligt. Det skyldes, at i enkelte talbaser kan visse fraktioner ikke repræsenteres nøjagtigt.

Et eksempel: Base 10 har ingen måde at præcis repræsentere fraktionen 1/3. Du kan tilnærme det som 0. 3333333, men i sidste ende når du grænsen for hvor mange cifre du kan gemme, så du skal stoppe. I base 2 sker det, at en af ​​de fraktioner, du ikke kan repræsentere korrekt, er decimalværdien 1/10. Med andre ord kan en float eller dobbelt variabel ikke repræsentere nøjagtigt 0. 1 .

Prøv at køre denne kode:

float x = 0. 1f;

NumberFormat nf = NumberFormat. getNumberInstance ();

nf. setMinimumFractionDigits (10);

System. ud. println (nf. format (x));

Det resulterende output er dette:

0. 1000000015

Selvom 0. 1000000015 er tæt til 0. 1 , er det ikke nøjagtigt.

I de fleste tilfælde er Java's floating-point-matematik tæt nok ikke for noget. Fejlmarginen er ekstremt lille. Hvis du bruger Java til at måle størrelsen af ​​dit hus, ville du have brug for et elektronmikroskop for at lægge mærke til fejlen. Hvis du skriver applikationer, der omhandler finansielle transaktioner, kan normal afrunding undertiden forstørre fejlene for at gøre dem væsentlige. Du kan opkræve en øre for meget eller for lidt moms. Og i ekstreme tilfælde kan dine fakturaer faktisk have indlysende additionsfejl.

Selvfølgelig er også heltaletyper gemt i binære. Men heltal er ikke underlagt de samme fejl, som floating-point-typer er - fordi heltal ikke repræsenterer fraktioner overhovedet - så du behøver ikke bekymre dig om denne type fejl for heltal typer.

Division med nul

Ifølge de grundlæggende regler for matematik kan du ikke dividere et tal med nul. Årsagen er enkel: Division er den omvendte multiplikation - hvilket betyder, at hvis a * b = c , er det også sandt, at a = c / b . Hvis du ville tillade b at være nul, ville division være meningsløs, fordi ethvert antal gange nul er nul. Derfor skal både a og c også være nul. Kort sagt, matematikere løst dette dilemma for århundreder siden ved at sige, at division med nul simpelthen ikke er tilladt.

Så hvad sker der, hvis du gør forsøg på at dele et nummer med nul i et Java-program? Svaret afhænger af, om du deler heltal eller flydende punktnumre. Hvis du deler heltal, sætter den sætning, der forsøger divisionen med nul, op, hvad der kaldes en undtagelse,, som er en uhyrlig måde at nedbryde programmet på.

Der er en måde at aflytte denne undtagelse for at lade dit program fortsætte, som du ikke kan finde ud af her. I mellemtiden vil ethvert program du skriver, forsøger et heltal division ved nulbrud.

Hvis du forsøger at opdele en flydende punkttype med nul, er resultaterne ikke så pludselige. I stedet tildeler Java til det flytende punktresultat en af ​​de specielle værdier, der er angivet i tabellen nedenfor. Følgende afsnit forklarer, hvordan disse særlige værdier bestemmes:

  • Hvis du deler et tal med nul, og tegnet på begge tal er det samme, er resultatet en positiv uendelighed. 0. 0 divideret med 0. 0 er positiv uendelighed, som det er -34. 0 divideret med -0. 0 .
  • Hvis du deler et tal med nul, og tegnene på tallene er forskellige, er resultatet negativt uendeligt. -40. 0 divideret med 0. 0 er negativ uendelighed, som det er 34. 0 divideret med 0. 0 .
  • Hvis du deler nul med nul, er resultatet ikke et tal (NaN), uanset tegnene.
Flydende og dobbeltklassens særlige konstanter
Konstant Betydning
POSITIVE_INFINITY Positiv uendelighed
NEGATIVE_INFINITY Negativ uendelighed
NaN Ikke et tal

Flydende punkt nuller kan være positive eller negative. Java anser positive og negative nuller for at være lige numerisk.

Hvis du forsøger at udskrive en flydende punktværdi, der har en af ​​disse specielle værdier, konverterer Java værdien til en passende streng. Antag at du udfører følgende udsagn:

double x = Math. sqrt (-50); // Ikke et tal

dobbelt y = x;

hvis (x == y)

System. ud. println ("x er lig med y");

Den resulterende konsoludgang er

Uendelig

Hvis i var -50. 0 , vil konsollen vise -Infinitet , og hvis i var nul, vil konsollen vise NaN .

De følgende afsnit beskriver nogle endelige bitterheder:

  • NaN er ikke lig med sig selv, hvilket kan have nogle mærkelige konsekvenser. For eksempel:

dobbelt x = matematik. sqrt (-50); // Ikke et tal

dobbelt y = x;

hvis (x == y)

System. ud. println ("x er lig med y");

Tænk for argumentets skyld, at hvis erklæringen tester om variablen x er lig med variablen y . Fordi denne test straks følger en opgaveopgørelse, der tildeler værdien x til y , kan du med sikkerhed antage at x er lig med y , højre?

Forkert. Fordi x er NaN , y også er NaN . NaN anses aldrig for at være lig med nogen anden værdi, herunder en anden NaN . Således mislykkes sammenligningen i hvis sætningen.

  • En anden underlig konsekvens: Du kan ikke antage, at et tal minus sig selv altid er nul. Overvej denne erklæring:

double z = x - x; // ikke nødvendigvis nul

Skal ikke denne erklæring altid sætte z til nul? Ikke hvis x er NaN . I så fald er ikke et tal minus et tal stadig et tal.

  • En anden underlighed: Enhver matematisk operation, der involverer uendelig, resulterer i enten en anden uendelighed eller NaN . Infinity + 5, for eksempel, er stadig lig med uendelighed, så Buzz Lightyears kald "Til uendelig og videre! "Det kommer bare ikke til at ske. Men uendelighed minus uendelighed giver dig … NaN .
Et par underlige ting om Java Math - dummies

Valg af editor

Hvordan man skriver en check for en fremragende bill i QuickBooks Online - dummies

Hvordan man skriver en check for en fremragende bill i QuickBooks Online - dummies

Du kan Brug QuickBooks Online (QBO) Check vinduet til at skrive en check for at betale et faktura, du tidligere indtastede - noget, du ikke kan gøre i QuickBooks desktop produkt. Brug ikke Check-transaktionen, hvis du planlægger at betale flere regninger. Hvis du vælger en betalingsmodtager, for hvem der foreligger en udestående faktura, QBO ...

Sådan afskrives fakturaer med QuickBooks Online Accountant - dummies

Sådan afskrives fakturaer med QuickBooks Online Accountant - dummies

Vælger skrivefakturaer fra revisionsværktøjerne menuen i QBOA viser siden Skriv ud fakturaer, som giver dig mulighed for at se fakturaer, du måske vil afskrive, og derefter skrive dem til en konto efter eget valg. Øverst på siden indstiller du filtre for at få vist de fakturaer, du vil have ...

Importrevisorens ændringer til QuickBooks 2012 Datafil - dummies

Importrevisorens ændringer til QuickBooks 2012 Datafil - dummies

Din klient importerer de ændringer, som du ' har lavet i revisorens kopi af QuickBooks 2012-datafilen i hendes arbejdskopi af datafilen. For at gøre dette vælger klienten filen Arkiv → Revisorens Kopi → Klientaktiviteter → Kommandoen Import Revisorens Ændringer. QuickBooks viser dialogboksen Importer regnskabsførerens ændringer. For at bruge importkontoens ændringer ...

Valg af editor

Brug Flash med Nature Photography - dummies

Brug Flash med Nature Photography - dummies

Som regel afhænger du af naturlig belysning til naturfotografering. Du kan dog bruge flash-flash eller en ekstra flash-enhed til at øge naturlig belysning. On-flash-kamera De fleste digitale kameraer leveres med en flash på kameraet. Blitzenheden springer op, når det er nødvendigt. Du kan også aktivere flash på kameraet, når du skal tilføje en ...

Brug tredjeparts rå software til HDR fotografi - dummies

Brug tredjeparts rå software til HDR fotografi - dummies

Du kan købe eller downloade et væld af Råredigerere og konvertere fra tredjepart, der hjælper dig med at lave billeder med høj dynamisk rækkevidde. Hvis du er utilfreds med din nuværende software og vil prøve noget nyt, skal du hænde på en eller flere af de programmer, der er angivet i tabellen. Rå redaktører fra tredjepart Navn URL Platform (er) Freeware? ...

Brug dekorative accenter i mad stil og madfotografi - dummies

Brug dekorative accenter i mad stil og madfotografi - dummies

Når fødevaren alene ikke skaber Det drama eller den intrigue, du vil have i din fotografering med dekorative accenter - af farve, form eller tekstur - kan give dine billeder den ekstra effekt, du leder efter. Accenter er forbedringer af fødevarematerialet, og selvom de tjener formålet med at ophæve maden, er de ...

Valg af editor

Sådan finder du formatering i Word 2007 - dummies

Sådan finder du formatering i Word 2007 - dummies

Du kan bruge kommandoen Find til at skure dit Word 2007-dokument til formatering af oplysninger. Hvis du f.eks. Kun vil finde de forekomster af ordet, der ligger i fed skrift, kan du gøre det. Dette eksempel søger efter teksten gåseæg med en skriftstørrelse på 24 point i en ...

Hvordan man finder tekst i Word 2016 - dummies

Hvordan man finder tekst i Word 2016 - dummies

Ikke gider med båndet! For at finde tekst i dit Word 2016-dokument, tryk Ctrl + F, den mindeværdige tastaturgenvej til kommandoen Find. Du ser navigationsruden, svarende til hvad der vises her. Navigationsruden. Skriv den tekst, du vil lokalisere, i feltet Søg dokument. Når du skriver forekomster af teksten ...

Hvordan man finder stilarter i Word 2016 - dummies

Hvordan man finder stilarter i Word 2016 - dummies

Stilarter bor på Word 2016 Home-fanen navngivet Styles-gruppe, som vist her. Hvad du ser på båndet er Style Gallery, som kan udvides til en fuld menu med stilvalg. Hvor Word-stilarter lurer. Klik på dialogboksen launcher i det nederste højre hjørne af Styles-gruppen ...