|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Jan 2015
Messaggi: 6
|
[C] Calcolo del seno
Ciao a tutti.
Mi sono posto un problema: come fanno le calcolatrici a calcolare il seno e il coseno di qualsiasi numero preso in input? In pratica mi chiedevo come fossero implementate le funzioni del calcolo del seno e del coseno all'interno di math.h per cercare di rifarle, perchè, conosciuto il valore di un angolo, non riesco ad arrivare al seno solo gemetricamente (senza utilizzare ovviamente teoremi vari come il teorema della corda che include il seno stesso dell'angolo). Riuscite ad aiutarmi? |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Jul 2005
Messaggi: 738
|
come fanno le calcolatrici esattamente non lo so ma un metodo di calcolo numerico c'è.
Mai come in questo caso google is your friend: http://www.luigisirignano.it/index.p...gory&catid=266 ho il sospetto che ci sia un metodo iterativo meno "pesante" dal punto di vista computazionale ma non sono riuscito a trovarlo
__________________
O.S.: WIN 10 64-bit CPU: INTEL I5 12400F RAM: 16 GB Corsair Vengeance LPX 3200 Mhz VGA: MSI ARMOR RX570 4GB OC MOBO: ASROCK B660M PRO RS HDD: Seagate 1TB SDD: CRUCIAL MX500 500GB ALI: BE QUIET PURE POWER CM 11 600W |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Dai un'occhiata a questa implementazione
Codice:
double mysin(double x, size_t number_of_terms)
{
const double x2 = x * x;
double t = x;
double result = t;
for (size_t i = 1; i < number_of_terms; ++i)
{
t = t * x2 / (double(2*i) * double(2*i+1));
if (i % 2 == 0) result += t;
else result -= t;
}
return result;
}
v = mysin(arg, 9); |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Per ottimizzare e velocizzare aumentando la precisione, è possibile precalcolare il valore nella prima espressione e utilizzare una tabella più ampia; inoltre è possibile gestire un'altra variabile per il segno.
In pratica Codice:
#include <math.h>
double mysin(double x)
{
const double x2 = x * x;
const double tb[] = {6.0, 20.0, 42.0, 72.0, 110.0, 156.0, 210.0, 272.0, 342.0, 420.0, 506.0, 600.0, 702.0};
double t = x;
double result = t;
double sg = -1.0;
for (size_t i = 0; i<13; ++i)
{
t *= x2 / tb[i];
result += sg * t;
sg = -sg;
}
return result;
}
int main()
{
double arg;
for(arg=0.0; arg<3.1415; arg+=3.1515/20)
printf("%.15f %.15f\n", mysin(arg), sin(arg));
return 0;
}
Ultima modifica di lorenzo001 : 26-01-2015 alle 11:37. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Nel passato usavano questo metodo, ma non sono sicuro sia ancora usato dalle calcolatrici.
http://en.wikipedia.org/wiki/CORDIC Il CORDIC era un chip che poteva essere usato per seni e coseni, tangenti e arcotangenti, funzioni iperboliche e radice quadrata di un numero. Fu fatto per sostituire un circuito analogico che al tempo veniva usato per le stesse cose. Per le nuove sono propenso a dare ragione ad Antonio, fare moltiplicatori e divisori al giorno d'oggi non è più una roba complessissima come lo era 50 anni fa.
__________________
L'elettronica digitale non esiste, è solo elettrotecnica con interruttori piccoli!
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Non ho indicato quel codice per dire che lo usano le calcolatrici ma solamente per suggerire un modo "semplice" di calcolare il seno, facendo a meno di elaborare potenze.
Se non mi sbaglio, era il metodo usato nel "vecchio" Commodore 64. |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2014
Messaggi: 852
|
Se sei curioso, ti consiglio di dare uno sguardo qui: http://rosettacode.org/wiki/Trigonom...functions#REXX
Non è in c, ma gli algoritmi si possono implementare in qualunque linguaggio. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:24.



















