Gå til innhold

Invers av Cos Sin Tan (Cos^-1 Sin^-1 og Tan^-1)


Anbefalte innlegg

Jeg har akkurat begynnt å jobbe med Visual Basic 6.0

 

Jeg tengte jeg skulle prøve å lage en kalkulator med Cos, Sin og Tan.

Det fikk jeg til, men jeg fikk ikke til å regne ut det inverse av Cos og Sin, bare av Tan med formelen Atn(X)

 

Altså jeg lurer på hva koden for Cos^-1 og Sin^-1 er?

(^=opphøyd i)

Jeg har prøvd noen koder, men da krasjet programmet hvis jeg tok Sin^-1(1)

 

For eksempel vil jeg at svaret av Cos^-1(0,5)=60grader.

 

Er det bare å gange med pi og dele på 180 for å gjøre om radianer til grader?

 

 

Kodene mine:

 

Private Sub Command1_Click()

Dim Tall1, Tall2, Sum, pi

Tall1 = Text1.Text

Tall2 = Text2.Text

pi = 3.14159265358979

 

If Option1.Value = True Then Sum = Tall1 * Tall2

If Option2.Value = True Then Sum = Tall1 / Tall2

If Option3.Value = True Then Sum = Tall1 - Tall2

If Option6.Value = True Then Sum = Tall1 + Tall2

 

If Option7.Value = True Then Sum = Cos(Tall1 * pi / 180)

If Option8.Value = True Then Sum = Sin(Tall1 * pi / 180)

If Option9.Value = True Then Sum = Tan(Tall1 * pi / 180)

 

 

If Option10.Value = True Then Sum = Cos(Tall1 * pi / 180) :no:

If Option11.Value = True Then Sum = Sin(Tall1 * pi / 180) :no:

If Option15.Value = True Then Sum = Atn(Tall1) * 180 / pi :dontgetit:

 

 

:hmm:

 

De siste linjene som er understreket skal jeg bytte ut me de nye formlene!!

 

(er det forresten nøye å skrive As xxx etter variabelnamnet i Dim-kommandoen?

Hva skjer hvis det ikke står noe, som i koden min?)

Endret av P0wer
Lenke til kommentar
Videoannonse
Annonse
Er det bare å gange med pi og dele på 180 for å gjøre om radianer til grader?

Sannsynligvis, skjønt jeg bruker helst følgende konstanter for å forenkle omregningen:

 

Public Const PI = 3.14159265358979

Public Const Radian = PI / 180

Se på følgende liste. Koden du benytter nå, er ikke for den omvendte sinus og cosinus:

 

Secant: Sec(X) = 1 / Cos(X)

Cosecant: Cosec(X) = 1 / Sin(X)

Cotangent: Cotan(X) = 1 / Tan(X)

Inverse Sine: Arcsin(X) = Atn(X / Sqr(-X * X + 1))

Inverse Cosine: Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

Inverse Secant: Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) - 1) * (2 * Atn(1))

Inverse Cosecant: Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1))

Inverse Cotangent: Arccotan(X) = Atn(X) + 2 * Atn(1)

Hyperbolic Sine: HSin(X) = (Exp(X) - Exp(-X)) / 2

Hyperbolic Cosine: HCos(X) = (Exp(X) + Exp(-X)) / 2

Hyperbolic Tangent: HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))

Hyperbolic Secant: HSec(X) = 2 / (Exp(X) + Exp(-X))

Hyperbolic Cosecant: HCosec(X) = 2 / (Exp(X) - Exp(-X))

Hyperbolic Cotangent: HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))

Inverse Hyperbolic Sine: HArcsin(X) = Log(X + Sqr(X * X + 1))

Inverse Hyperbolic Cosine: HArccos(X) = Log(X + Sqr(X * X - 1))

Inverse Hyperbolic Tangent: HArctan(X) = Log((1 + X) / (1 - X)) / 2

Inverse Hyperbolic Secant: HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)

Inverse Hyperbolic Cosecant: HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)

Inverse Hyperbolic Cotangent: HArccotan(X) = Log((X + 1) / (X - 1)) / 2

Logarithm to base N: LogN(X) = Log(X) / Log(N)

I tillegg er det inndata som skal omgjøres til grader, ikke utdata, om jeg tar feil (jf. siste linje i koden din). For øvrig vil jeg anbefale å heller gange med Radian-kontanten ovenfor enn å utføre omregningen direkte i koden.

 

(er det forresten nøye å skrive As xxx etter variabelnamnet i Dim-kommandoen?

Hva skjer hvis det ikke står noe, som i koden min?)

Ja, det er temmelig vesentlig. Variant er mye tregere og opptar mer minne enn de egnede datatypene, og du får dessuten mye mindre kontroll over sluttproduktet av mang en utregning. Med Variant må du selv forsikre deg om at tallet er uten desimaler, mens du med Long, eksempelvis, får dette konvertert automatisk.

Endret av aadnk
Lenke til kommentar

:dribble: Jeg har byttet ut kodene med disse: :yes:

 

Private Sub Command1_Click()

Dim Tall1, Tall2, Sum

Dim pi, RadGra, GraRad

 

Tall1 = Text1.Text

Tall2 = Text2.Text

 

'pi kan også skrivest som 4 * Atn(1)

pi = 3.14159265358979

 

RadGra = (pi / 180)

GraRad = (180 / pi)

 

'cos-1

If Option17.Value =

True Then Sum = (-Atn(Tall1 / Sqr(-Tall1 * Tall1 + 1)) + (pi) / 2) * GraRad

 

'sin-1

If Option16.Value = True

Then Sum = Atn(Tall1 / Sqr(-Tall1 * Tall1 + 1)) * GraRad

 

'tan-1

If Option15.Value = True Then Sum = Atn(Tall1) * GraRad

 

'Kvadratroten kan også srivest som Sqr(Tall1)

If Option10.Value = True Then Sum = Tall1 ^ (1 / 2)

 

'Kubikkrot

If Option18.Value = True Then Sum = Tall1 ^ (1 / 3)

 

Kalkulatoren greier ikke å regne ut at Sin^-1(1)=90.

Det kommer bare en feilmelding og programmet krasjer, hva er galt?

 

Er det mulig å få flere siffere i pi? :dontgetit:

Jeg limte inn pi fra windowskalkulatoren, men ca 15 siffer bak kommaet forsvant! :mad:

Bilr det mer nøyaktig hvis jeg bruker 4 * Atn(1) ? :w00t:

 

Hva betyr Public Const ?

 

Ikke skriv vanskelige svar, dette er det første programmet jeg noen sinne har laget :):) !!

Endret av P0wer
Lenke til kommentar

Fortsatt må du deklarere datatypene

 

Dim Tall1 As Decimal, Tall2 As Decimal, Sum As Decimal
Dim pi As Decimal, RadGra As Decimal, GraRad As Decimal

 

Grunnen til at du burde bruke decimal, er fordi decimal er enten 80 bit, eller 128 bit

 

Og fortell at alt av konstanter, som f.eks. 1 skal være flyttall, altså 1.0

 

Er det mulig å få flere siffere i pi? dontgetit.gif

Jeg limte inn pi fra windowskalkulatoren, men ca 15 siffer bak kommaet forsvant! mad.gif

Bilr det mer nøyaktig hvis jeg bruker 4 * Atn(1) ?

 

De forsvinner fordi calc.exe ikke bruker hverken Single eller Double precision floating point, altså noe mer presist, kan være at den er 80 bit eller mer.

 

Grunnen til at jeg sier 80 bit så mye, er fordi prosessorens FPU (floating Point Unit) regner med enten 32 bit (single), 64 bit (double) eller 80 bit (som sjeldent blir brukt) public betyr at den er mulig å få tak i fra utenfor modulen, formen eller klassen den er deklarert i.

 

Hva betyr Public Const ?

 

Du bruker const når det er noe du kanskje vil at VB skal regne ut under kompilering (altså når du trykker F5, eller lager .exe fil av det) eller at verdien kanskje vil endres, uten at du må gå igjennom alle steder der du har skrevet 3.14 og bytte det ut.

Lenke til kommentar
sin 360 = -0,646217020866535

skulle ha vært

sin 360 = 0

 

tan 90 = 618987100438218,0

skulle ha vært

tan 90 = Matematisk feil

Dette er grunnet unøyaktigheter knyttet til konverteringen av grader til radian, men forskjellen er ikke så stor som du presenterer det her. Verdien jeg fikk på sinusfunksjonen var -6,46217020866535E-15 - et temmelig lavt nummer.

 

Hva tangens-funksjonen angår, må du nok fikse det der selv. Bruk en IF-setning til å teste om inndata er gyldig eller ei, før du bruker Tan-funksjonen.

Lenke til kommentar

Som jeg sa i mitt tidligere innlegg, bruk en IF-setning:

 

' Sjekk om inndata ikke er lik 360

If lngDegrees = 360 Then

 

    ' I så fall kan resultatet kun være null

    txtResult = 0

 

Else

 

    ' Kalkuler sinus

    txtResult = Sin(lngDegrees * Radian)

 

End If

Lenke til kommentar
Jeg tengte å legge til en funksjon til, nemlig å regne om desimaltall til binærtall, og omvendt.

Hva med følgende:

 

Public Function BinaryToDecimal(sBinary As String) As Long

 

    Dim Tell As Long

   

    ' Summer alle karakterer i strengen

    For Tell = 1 To Len(sBinary)

       

        ' Dersom dette er en sann-karakter, ...

        If Mid(sBinary, Tell, 1) = "1" Then

       

            ' ... summer

            BinaryToDecimal = BinaryToDecimal + 2 ^ (Len(sBinary) - Tell)

       

        End If

   

    Next

 

End Function

 

Public Function DecimalToBinary(ByVal lngValue As Long, ByVal lngMax As Long) As String

 

    Dim Tell As Long

   

    ' Først må vi allokere utdata

    DecimalToBinary = String(lngMax, "0")

   

    For Tell = lngMax - 1 To 0 Step -1

   

        ' Sjekk om vi kan sette bit'en til sann uten å overstige grensen

        If lngValue - (2 ^ Tell) >= 0 Then

       

            ' Sett verdi

            Mid(DecimalToBinary, lngMax - Tell, 1) = "1"

   

            ' Forminsk den gjeldende verdi

            lngValue = lngValue - (2 ^ Tell)

       

        End If

   

    Next

 

End Function

 

lngMax-variabelen er den maksimale lengden på binær-utdata. Med den kan du spesifisere hvorvidt du ønsker å motta binær-representasjon av en Byte (8), Integer (16) eller Long.

Lenke til kommentar
  • 2 uker senere...

Hvordan i all verden skal jeg bruke desimal-binær-funksjonen??:

 

 

Public Function DecimalToBinary(ByVal lngValue As Long, ByVal lngMax As Long) As String

 

    Dim Tell As Long

   

    ' Først må vi allokere utdata

    DecimalToBinary = String(lngMax, "0")

   

    For Tell = lngMax - 1 To 0 Step -1

   

        ' Sjekk om vi kan sette bit'en til sann uten å overstige grensen

        If lngValue - (2 ^ Tell) >= 0 Then

       

            ' Sett verdi

            Mid(DecimalToBinary, lngMax - Tell, 1) = "1"

   

            ' Forminsk den gjeldende verdi

            lngValue = lngValue - (2 ^ Tell)

       

        End If

   

    Next

 

End Function

 

 

 

Jeg skal ha et tekstfelt, Text1.text, for å skrive desimaltall i, en label, Label1.Caption, til å vise binærtallet og en knapp, Command1.Command, for å starte utregningen.

 

Kan du forklare hvordan For ... Next - loopen i koden "virker"?

Jeg er nybegynner!

:)

Endret av P0wer
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...