Area på en cirkel kalkylator, hjälp!

Permalänk
Medlem

Area på en cirkel kalkylator, hjälp!

Hej, jag fick för mig att göra en kalkylator enbart gjort för att räkna ut arean på en cirkel.
Som ni nog vet så är formeln för det pi*r^2

Jag tog 30 st decimaler i pi, fast varje gång jag kör programmet så försvinner det en jävla massa decimaler, varför gör det så?

Min kod:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim radius As Integer
Dim answer As Integer
Dim pi As Integer
pi = 3.1415926535897931
radius = TextBox1.Text
answer = pi * radius * radius

TextBox2.Text = answer
End Sub
Notera att decimalerna försvunnit där, bara några kvar..

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Hedersmedlem

Ser ut som Visual Basic?

Har inte pysslat med VB men förstår inte hur du kan ha några decimaler alls eftersom du använder datatypen integer?

Någon mer bekant med språket får hjälpa dig.

Permalänk
Medlem
Skrivet av Shimonu:

Ser ut som Visual Basic?

Har inte pysslat med VB men förstår inte hur du kan ha några decimaler alls eftersom du använder datatypen integer?

Någon mer bekant med språket får hjälpa dig.

Hmm, du har nog rätt. Då jag inte är lärd alls inom visual basic så förstår jag inte allt såntdär med olika sådana saker ^^ Får googla runt lite, oh boy do I feel stupid D:

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Medlem
Skrivet av reflect:

Hmm, du har nog rätt. Då jag inte är lärd alls inom visual basic så förstår jag inte allt såntdär med olika sådana saker ^^ Får googla runt lite, oh boy do I feel stupid D:

Ändra dina integers till Single istället så kan du hantera decimaler

Visa signatur

~. Citera så jag hittar tillbaka .~

Permalänk
Medlem

Har inte programmerat i VB, men en integer fungerar ju inte för en "float", du borde nog använda typ "single" eller "double". Kanske? : )

Permalänk
Medlem
Skrivet av Aera:

Har inte programmerat i VB, men en integer fungerar ju inte för en "float", du borde nog använda typ "single" eller "double". Kanske? : )

Skrivet av 19KeVVa93:

Ändra dina integers till Single istället så kan du hantera decimaler

Den hoppar fortfarande ner till några decimaler.. :/

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Hedersmedlem
Skrivet av reflect:

Den hoppar fortfarande ner till några decimaler.. :/

Visa exakt vad du får för utskrift.

Gjorde du om alla variabler till Single/Double?

Permalänk
Medlem
Skrivet av Shimonu:

Visa exakt vad du får för utskrift.

Gjorde du om alla variabler till Single/Double?

Skriver in:

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim radius As Single
Dim answer As Single
Dim pi As Single

pi = 3.1415926535897932384626433832795
radius = TextBox1.Text
answer = pi * radius * radius

TextBox2.Text = answer
End Sub

När jag debuggar får jag

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim radius As Single
Dim answer As Single
Dim pi As Single

pi = 3.141592653589
radius = TextBox1.Text
answer = pi * radius * radius

TextBox2.Text = answer
End Sub
Notera att pi decimalerna blir mycket färre

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Medlem

Det har såklart inget med din programmering att göra, men man kommer rätt långt med 16 decimaler också!

Ljusets hastighet vet man till exempel till 8 decimalers noggrannhet, och det bygger man rätt mycket beräkningar på, till exempel definieras en meter som den sträcka som ljuset färdas på 1/299792458-delssdekund. Så man kan säga att vi inte ens vet hur lång en meter är till bättre än 8 decimalers noggrannhet

Visa signatur

Phenom II x4 955, Radeon 4870 1 GB, 4GB DDR3 1333MHz, Corsair VX 550W

Permalänk
Medlem
Skrivet av JayDee:

Det har såklart inget med din programmering att göra, men man kommer rätt långt med 16 decimaler också!

Ljusets hastighet vet man till exempel till 8 decimalers noggrannhet, och det bygger man rätt mycket beräkningar på, till exempel definieras en meter som den sträcka som ljuset färdas på 1/299792458-delssdekund. Så man kan säga att vi inte ens vet hur lång en meter är till bättre än 8 decimalers noggrannhet

B-b-but windows calculator has it

Det har du rätt i. Får nöja mig med detta tillsvidare

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Medlem

Ändra till Double istället för Single till att börja med så borde du kunna hantera fler decimaler.

Visa signatur

Desktop - Intel i7 6700K | Asus Z170-A | 32 GB Corsair DDR4 | Rx 480 w/ Arch Linux
Laptop - Thinkpad X1 Carbon Gen. 4 w/ Arch Linux
NAS - Ryzen Pro 3400G @ 35W | 64GB ECC | 32 TB HDD w/ TrueNAS Core

Permalänk
Skrivet av Zpiritual:

Ändra till Double istället för Single till att börja med så borde du kunna hantera fler decimaler.

Nu var det ett tag sedan jag gjorde något i VB, men om minnesmängd inte är ett problem (väldigt många flyttal ska användas) så tror jag att på senare år så har datatypen Decimal tillkommit som kan lagra mer exakta flyttal då det är en 128-bit datatyp i stället för 64-bit som Double använder. Det som kan göra den svårarbetad är att den bygger på att allt lagras med en tiopotens och up till 29 värdesiffror, så ett tal som 101,57 blir 1,0157e2. Detta kan man ju dock lösa med kreativ programering om man vill få ut resultatet som ett "vanligt" tal.

Visa signatur

Jag kan ha fel, men jag tror att jag har rätt.

Permalänk
Hedersmedlem
Skrivet av JayDee:

Det har såklart inget med din programmering att göra, men man kommer rätt långt med 16 decimaler också!

Ljusets hastighet vet man till exempel till 8 decimalers noggrannhet, och det bygger man rätt mycket beräkningar på, till exempel definieras en meter som den sträcka som ljuset färdas på 1/299792458-delssdekund. Så man kan säga att vi inte ens vet hur lång en meter är till bättre än 8 decimalers noggrannhet

Det är bättre än så: ljusets hastighet i vakuum (c) vet man exakt i den mening att dess enhet i sig är definierad efter just c! Det är inte så att 299792458 m/s är det bästa mätvärde vi har, och att vi kommer få decimaler om vi mäter bättre — vi har som du säger definierat metern så att ljusets hastighet är exakt det heltalsvärdet i den enheten, så hur bra vi än mäter så kommer c alltid vara exakt det värdet — ett bättre "mätvärde" skulle bara leda till att t ex metern definierades om.

Metern beror ju dock även på sekunden, som även den är definierad som ett exakt antal övergångar av en viss typ i en viss atom. Här kommer dock mätosäkerheter in, men upp till 10⁻¹¹ ska metern vara bestämd i labbmiljöer.

Tillbaka till trådens ämne (nåja! ) så är så många decimaler av π inte nödvändigt för egentligen några praktiska beräkningar. Kan du radien för ett objekt lika stort som jorden med en meters noggrannhet så får du ingen extra noggrannhet i beräkningen av dess omkrets med fler än 7 decimaler av π. Troligen ska du också mäta mindre saker . Att ha π som en `int` och använda närmevärdet 3 är faktiskt inte så dåligt som det låter i praktiska beräkningar . Jag använde det senast igår för att räkna ut hur lång en hoprullad nätverkskabel var utan att rulla ut den, med väldigt lyckat resultat.

Tillbaka än mer till ämnet: att du inte kan lagra ett decimaltal exakt på det sättet beror på hur flyttal hanteras i en dator. Det är faktiskt så "illa" att inte ens datatypen `double` klarar av att lagra data med mer än 15–17 korrekta gällande siffror i det decimala talsystemet. Datatypen decimal är 128-bitars och kan lagra upp till 28 decimaler korrekt i det decimala talsystemet, men det är helt irrelevant för alla tillämpningar i praktiken.

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Det är bättre än så: ljusets hastighet i vakuum (c) vet man exakt i den mening att dess enhet i sig är definierad efter just c! Det är inte så att 299792458 m/s är det bästa mätvärde vi har, och att vi kommer få decimaler om vi mäter bättre — vi har som du säger definierat metern så att ljusets hastighet är exakt det heltalsvärdet i den enheten, så hur bra vi än mäter så kommer c alltid vara exakt det värdet — ett bättre "mätvärde" skulle bara leda till att t ex metern definierades om.

Metern beror ju dock även på sekunden, som även den är definierad som ett exakt antal övergångar av en viss typ i en viss atom. Här kommer dock mätosäkerheter in, men upp till 10⁻¹¹ ska metern vara bestämd i labbmiljöer.

Tillbaka till trådens ämne (nåja! ) så är så många decimaler av π inte nödvändigt för egentligen några praktiska beräkningar. Kan du radien för ett objekt lika stort som jorden med en meters noggrannhet så får du ingen extra noggrannhet i beräkningen av dess omkrets med fler än 7 decimaler av π. Troligen ska du också mäta mindre saker . Att ha π som en `int` och använda närmevärdet 3 är faktiskt inte så dåligt som det låter i praktiska beräkningar . Jag använde det senast igår för att räkna ut hur lång en hoprullad nätverkskabel var utan att rulla ut den, med väldigt lyckat resultat.

Tillbaka än mer till ämnet: att du inte kan lagra ett decimaltal exakt på det sättet beror på hur flyttal hanteras i en dator. Det är faktiskt så "illa" att inte ens datatypen `double` klarar av att lagra data med mer än 15–17 korrekta gällande siffror i det decimala talsystemet. Datatypen decimal är 128-bitars och kan lagra upp till 28 decimaler korrekt i det decimala talsystemet, men det är helt irrelevant för alla tillämpningar i praktiken.

Tack för det Ville bara ha det onödigt exakt

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Medlem

För den som vill räkna ut pi inom VB, så finns det ett kommando för det: system.math.pi Så smart som jag är hittade jag på det

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2

Permalänk
Hedersmedlem
Skrivet av reflect:

För den som vill räkna ut pi inom VB, så finns det ett kommando för det: system.math.pi Så smart som jag är hittade jag på det

Ja, säkerligen bäst att använda. Men det mynnade ju ut i en hyfsat intressant diskussion ändå, det här .

Visa signatur

Nu med kortare användarnamn, men fortfarande bedövande långa inlägg.

Permalänk
Medlem
Skrivet av phz:

Ja, säkerligen bäst att använda. Men det mynnade ju ut i en hyfsat intressant diskussion ändå, det här .

Ja, det kan man verkligen säga

Visa signatur

Corsair 750D | i5 4670k | ASUS Z87-a | 8GB Corsair Dominator | Asus GTX770-DC2OC | Samsung 840 EVO 250GB | WD 500GB X2