Wpis z mikrobloga

Jeżeli x jest typu double i ma wartość bezwzględną <= 2^(-26), najlepszym przybliżeniem sin(x) jest x.

pow(2, -26)
1.4901161193847656e-08
math.sin(pow(2, -26))
1.4901161193847656e-08

pow(2, -27)
7.4505805969238281e-09
math.sin(pow(2, -27))
7.4505805969238281e-09

#programowanie
  • 5
  • Odpowiedz
@jacekprim: ale to nie tylko w programowaniu, ogólnie się tego używa w inżynierii i obliczeniach fizycznych "na kartce", i to dla znacznie większych wartości niż 1.5e-8

ogólnie to wynika z rozwinięcia szeregu Maclaurina dla sin(x):
sin(x) = sin(0) + x * cos(0) - x^2 * sin(0) / 2 - x^3 * cos(0)/6 +... ,a ponieważ sin(0) = 0 to zostaje sin(x) = x - x^3 / 6 + jakaś reszta.
  • Odpowiedz
@bandy: @leoha:

A gdzie na studiach uczą pisania funkcji zwracających float/double najbliższy prawdziwej wartości funkcji, zwłaszcza funkcji przestępnej, dla danego argumentu? Na przykład właśnie pisania funkcji takiej, że jej wynikiem jest double najbliższy rzeczywistemu sinusowi (najbliższy, nie tylko bliski)? Albo chociaż gdzie uczą tego konkretnego przypadku, że dla bardzo dużej części argumentów return x jest lepszą implementacją sin(x) niż dosłownie każda inna funkcja, tzn. każdy inny niż x float/double jest bardziej oddalony od rzeczywistego wyniku?

Z tego co wiem, dla większości
  • Odpowiedz
@jacekprim: na studiach dostajesz podstawy matematyczne do wyciągania takich wniosków jak sinx ≈ x, dowiadujesz się o problemach z reprezentacją zmiennoprzecinkową albo jak wyznaczyć wielkość błędu algorytmu. Potem składasz z tego sam to co potrzebujesz.
Jakby miały być rzeczy typu "jak będziecie implementowali sin x, to zauważcie, że dla argumentów bliskich zeru można zwrócić po prostu x" to by studia trwały 20 lat i nikt ich nie kończył. Na co
  • Odpowiedz