Avatar billede mysitesolution Nybegynder
22. maj 2006 - 14:36 Der er 20 kommentarer og
1 løsning

Math.Cos problem

Hej...

Hvis jeg for eksempel siger

Math.Cos(10^100) så får jeg bare de 10^100 ud af det igen... Har ikke noget problem med at den ikke kan regne et så stort nummer, men den skal helst smide en exception  når det sker..
Avatar billede spif2001 Nybegynder
22. maj 2006 - 14:47 #1
double d = Math.Cos(10^100);

giver hos mig -0.999020813314648
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 14:51 #2
nej undskyld... tænkte på math.cos(math.pow(10,100));
Avatar billede spif2001 Nybegynder
22. maj 2006 - 14:55 #3
Ja den er lidt træls...

Du kunne evt. checke hvad der skal ind i Math.Cos() inden du gør det:

if(dinVar <= Double.MaxValue)
  Math.Cos(dinVar);
else
  throw new Exception("Hovsa!");
Avatar billede arne_v Ekspert
22. maj 2006 - 15:12 #4
Math.Pow(10,100) er mindre end Double.MaxValue

problemet er faktisk lidt tricky !

cos tager en fuld cycle mellem x og x+2*PI

double har en precision paa ca. 15 decimale cifre

d.v.s. at en double 1 i virkeligheden er 1 +/- 1e-15

og at en double 1e100 i virkeligheden er 1e100 +/- 1e85

+/- 1e85 for en funktion som laver en fuld cycle over bare 2*pi duer ikke
Avatar billede arne_v Ekspert
22. maj 2006 - 15:13 #5
jeg er dog ikke imponeret over haandteringen - de burde snarere smide en
exception
Avatar billede spif2001 Nybegynder
22. maj 2006 - 15:14 #6
jeg går lige så stille over i matematik-ignorant-hjørnet og gemmer mig lidt...
Avatar billede arne_v Ekspert
22. maj 2006 - 15:20 #7
det behoever du absolut ikke

jeg har arbejde med programmering og floating point i 20 aar og jeg havde aldrig
taenkt over det

Java forsoeger iovrigt at regne det ud

Java haevder at Math.cos(Math.pow(10,100)) er 0.9247242387519338

men det har jeg ikke meget fidus til

den haevder nemlig ogsaa at Math.cos(2*Math.PI*Math.pow(10,100)) er 0.959414706525737
Avatar billede spif2001 Nybegynder
22. maj 2006 - 15:22 #8
og jeg kan se jeg skal blive der lidt endnu...  ;)
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 18:22 #9
Er mega nedern... kunne man evt. lave sine egne uden de store problemer?
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 18:25 #10
har også prøvet det spif siger med maxvalue, og isNaN
Avatar billede arne_v Ekspert
22. maj 2006 - 18:43 #11
mit forslag:

if(dinVar <= Math.Pow(10, 10()
  Math.Cos(dinVar);
else
  throw new Exception("Hovsa!");
Avatar billede arne_v Ekspert
22. maj 2006 - 18:48 #12
if(dinVar <= Math.Pow(10, 10))
  res = Math.Cos(dinVar);
else
  throw new Exception("Hovsa!");
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 18:50 #13
Men er Math.Pow(10, 10) det højste det må være?
Avatar billede arne_v Ekspert
22. maj 2006 - 19:03 #14
using System;

namespace E
{
    public class MainClass
    {
        public static void Main(string[] args)
        {
            for(int i = 0; i < 25; i++)
            {
                Console.WriteLine(i + " " + Math.Cos(2*Math.PI*Math.Pow(10, i)));
            }
        }
    }
}

udskriver:

0 1
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 0.999999999999997
9 0.999999999999998
10 0.999999999989971
11 0.999999999564059
12 0.999999854514547
13 0.999985451489618
14 0.999742553974104
15 0.888414279577966
16 0.718486839415201
17 -0.438832161761114
18 0.168593946229863
19 6.28318530717959E+19
20 6.28318530717959E+20
21 6.28318530717959E+21
22 6.28318530717959E+22
23 6.28318530717959E+23
24 6.28318530717959E+24
Avatar billede arne_v Ekspert
22. maj 2006 - 19:05 #15
den starter med at returnere input ved 19

og den bliver upraecis mellem 10 og 13

10 er et forsigtigt sted at cutte
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 20:49 #16
hHm har kigget lidt på det...

Excel fatter hat ved allerede cos(2*pi*10^7) mens mathcad kan klare op til cos(2*pi*10^12)... men bliver den egentlig allerede ustabil ved over 10^7?
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 20:51 #17
altså cos(2*pi*10^7)
Avatar billede arne_v Ekspert
22. maj 2006 - 21:10 #18
double precision har ca. 15 decimale cifres noejagtighed

singel precision har ca. 7 decimale cifres noejagtighed

saa bruger man single precision er man hurtigt lost
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 21:13 #19
hhm okay... må løse den på din måde, selvom jeg synes det er nedern fra MS side... opret svar..
Avatar billede arne_v Ekspert
22. maj 2006 - 21:24 #20
svar
Avatar billede mysitesolution Nybegynder
22. maj 2006 - 21:40 #21
har testet lidt mere i mathcad, og kan se at deres max er cos(1.000.000.000.000)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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