Avatar billede zaym01 Nybegynder
09. juni 2004 - 13:48 Der er 12 kommentarer og
1 løsning

Cos og sin funktionerne opfører sig underligt

Hej

  Jeg har lavet følgende program for at teste cosinus og sinus funktionerne i math.h:

#include <iostream>
#include <math.h>

using namespace std;

int main()
{
   
    cout<<sin(90.0)<<endl; // Burde ud fra enhedscirklen give 1
    cout<<cos(90.0)<<endl; // Burde ud fra enhedscirklen give 0
    cout<<sin(45.0)*sin(45.0)+cos(45.0)*cos(45.0)<<endl; // Udfra phytagoras burde detteher give 1
   
    system("pause");
    return 0;
}

  Den eneste af de tsts' som jeg har lavet der lykkedes er den der tager udgangspunkt i pythagoras. Hvad er det lige helt præcis der sker?
Avatar billede arne_v Ekspert
09. juni 2004 - 13:50 #1
cos og sin bruger radion ikke grader

prøv cos(90.0/180*pi)
Avatar billede arne_v Ekspert
09. juni 2004 - 13:51 #2
radian ikke radion ...
Avatar billede arne_v Ekspert
09. juni 2004 - 13:54 #3
Muligvis definerer den math.h en konstant M_PI som du kan bruge for pi.

Muligvis har din math.h også funktioner cosd, sind etc. som kører i grader fremfor
radian.

Prøv dig lidt frem.
Avatar billede zaym01 Nybegynder
09. juni 2004 - 14:00 #4
sin(90.0) = 0.98

  Der er langt fra 0.98 til 0,5 pi radian
Avatar billede zaym01 Nybegynder
09. juni 2004 - 14:01 #5
vent glem det
Avatar billede arne_v Ekspert
09. juni 2004 - 14:03 #6
OK ?
Avatar billede zaym01 Nybegynder
09. juni 2004 - 14:08 #7
Hvis jeg bruger:

sin(2*M_PI*90/360) passer det perfekt. Men gør jeg det samme med cos altså
cos(2*M_PI*90/360) får jeg noget helt hen i været. Hvis jeg sætter min lommeregner til at gøre det samme passer det perfekt, også med cos.
Avatar billede arne_v Ekspert
09. juni 2004 - 14:15 #8
Mystisk.

#include <stdio.h>
#include <math.h>

int main()
{
  printf("%f\n",sin(2*3.1415926535897932385*90/360));
  printf("%f\n",cos(2*3.1415926535897932385*90/360));
  return 0;
}

giver pænt:

1.000000
0.000000

hos mig.
Avatar billede zaym01 Nybegynder
09. juni 2004 - 14:26 #9
Hvad med min kode?
Avatar billede zaym01 Nybegynder
09. juni 2004 - 14:27 #10
fordi vi gør jo præcis det samme
Avatar billede zaym01 Nybegynder
09. juni 2004 - 14:29 #11
Ok detteher er skørt. Det virker fint når man bruger printf men ikke med cout..
Avatar billede arne_v Ekspert
09. juni 2004 - 14:41 #12
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
  cout << sin(2*3.1415926535897932385*90/360) << endl;
  cout << cos(2*3.1415926535897932385*90/360) << endl;
  return 0;
}

giver


1
6.12303e-017

hos mig.

Og det er OK.

6.1*10^-17 er meget meget tæt på nul.
Avatar billede segmose Nybegynder
09. juni 2004 - 15:11 #13
hvis du indstiller hvordan din float skal udskrives fx. uden e-notation og med 6 decimaler (eller FLT_DIG) vil du sikkert få 0.
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