Antoine,

Thanks for the link, very interesting.

Regards,

Federico Miyara

On 06/01/2021 05:22, Antoine Monmayrant wrote:

Hello Frederico,

Like Christophe, I am not sure this has anything to do with the implementation of sin(). It seems to be a known limitation of numerical calculations using floating numbers. In particular, even with en hypothetical ideal value of %pi, because of the conversion to a double, %pi*1e15 is converted to the nearest available double and this "shift" or error as compared to the ideal infinitely-precise value is increasing with the size of your number. Thus you make a x1e15 bigger error when using "%pi*1e15" than when using "%pi". As Christophe as said, there is not much you can do, apart from resorting to symbolic calculation (what Alpha does).

You can see that by using nearfloat to get the distance between two doubles:

    nearfloat("succ", %pi)-%pi
     ans  =   4.441D-16
    nearfloat("succ", %pi*1e15)-%pi*1e15
     ans  =   0.5

As I said, the error on the sin() argument is getting x1e15 bigger!

I'm sorry if my explanation of floating point numbers is not really good.
This one was a revelation for me: https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html . It helped me understand why it's usually a good idea to use "reduced units" for your calculations (ie keep everything close to 1 when possible).

I hope it helps,

Cheers,

Antoine
On 05/01/2021 09:19, Federico Miyara wrote:

Dear all,

In order to test the FFT on a periodic signal whose period is an exact submultiple of the FFT length I found a frequency fo satisfying this for the chosen sample rate and window length, and generated the following signal:

x = sin(2*%pi*fo*t);

where t is a time vector. This should be a perfectly periodic discrete signal but it isn't because the sin() function has a (virtually) exact period of pi, while %pi is exact to 16 digits only.

For instance, we have (23 digits shown)

--> sin(%pi)
 ans  =
   0.0000000000000001224647

--> sin(1e10*%pi)
 ans  =
  -0.0000022393627619559233

--> sin(1e15*%pi)
 ans  =
  -0.2362090532517409080526

The Wolfram Alpha site yields the correct value 0 in all cases (using their own pi).

Questions:

1) How is the sin() function extended to very large values of the argument? My first guess would be to compute a quarter cycle using Taylor and then extend it by symmetry and periodicity, but with which period? The best approximation available is 2*%pi. Or it is possible to use extended precision internally?

2) Is there a way to get a periodic discrete sine other than extending it periodically with the desired period?
Wouldn't this create a slight glitch at the frontier between cycles?

Regards,

Federico Miyara

<https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient> Libre de virus. www.avast.com <https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=emailclient>

<#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2>

_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users



--
El software de antivirus Avast ha analizado este correo electrónico en busca de 
virus.
https://www.avast.com/antivirus
_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users

Reply via email to