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..
Annonceindlæg tema
double d = Math.Cos(10^100); giver hos mig -0.999020813314648
nej undskyld... tænkte på math.cos(math.pow(10,100));
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!");
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
jeg er dog ikke imponeret over haandteringen - de burde snarere smide en exception
jeg går lige så stille over i matematik-ignorant-hjørnet og gemmer mig lidt...
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
og jeg kan se jeg skal blive der lidt endnu... ;)
Er mega nedern... kunne man evt. lave sine egne uden de store problemer?
har også prøvet det spif siger med maxvalue, og isNaN
mit forslag: if(dinVar <= Math.Pow(10, 10() Math.Cos(dinVar); else throw new Exception("Hovsa!");
if(dinVar <= Math.Pow(10, 10)) res = Math.Cos(dinVar); else throw new Exception("Hovsa!");
Men er Math.Pow(10, 10) det højste det må være?
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
den starter med at returnere input ved 19 og den bliver upraecis mellem 10 og 13 10 er et forsigtigt sted at cutte
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?
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
hhm okay... må løse den på din måde, selvom jeg synes det er nedern fra MS side... opret svar..
har testet lidt mere i mathcad, og kan se at deres max er cos(1.000.000.000.000)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.