n E Z => sin(n*pi) = -1 ?

조회 수: 3(최근 30일)
Emirhan Solmaz
Emirhan Solmaz 2022년 7월 21일
편집: James Tursa 2022년 7월 21일
the problem is simple at the first glance. if n is an integer, than sin(n*pi) should be "0". But it gives "-0,999".
isInt = @(n) sin(n*pi);
isInt(100000000000000000000000000000);
I get that the number should be small since the computation doesnt go beyond 10^17, but if I give 5, the result is "6*10^-16". Still, is not "0". How can I overcome this problem? is there a method? I need to solve the problem of "integer". It should be "exact integer". I couldn't find a way to get over it. Do you have any idea?

답변(4개)

Steven Lord
Steven Lord 2022년 7월 21일
Use the sinpi function.
n = 100000000000000000000000000000;
sinpi(n)
ans = 0
  댓글 수: 6
James Tursa
James Tursa 2022년 7월 21일
편집: James Tursa 2022년 7월 21일
"Basicly I need a way to calculate formulas beyond the limits of IEEE. which I suppose it is not possible. is it?"
Yes, it is. Use the Symbolic Toolbox as others have already suggested.
That being said, I suspect that your "algorithm", which you haven't discussed or shown us, may be producing garbage if you need 30 or more decimal digits of precision to calculate results. What else is going into this calculation and are you carrying enough precision in every variable to make the result meaningful? Can you post this code?

댓글을 달려면 로그인하십시오.


Stephen23
Stephen23 2022년 7월 21일
n = sym(100000000000000000000000000000)
n = 
100000000000000000000000000000
sin(n*pi)
ans = 
0
  댓글 수: 1
James Tursa
James Tursa 2022년 7월 21일
편집: James Tursa 2022년 7월 21일
Note that sym( ) here is doing the conversion based on its calculated "intent" of the user, since the actual number that gets passed to sym( ) isn't 100000000000000000000000000000 but something "nearby" as close as IEEE double precision can represent:
n = 100000000000000000000000000000;
fprintf('%30.0f\n',n);
99999999999999991433150857216
Also, there is another subtle conversion going on in the background. The double precision pi value is converted to its symbolic version based again on its calculated "intent" of the user. That is, here is the actual double precision pi value converted to decimal:
fprintf('%60.55f\n',pi);
3.1415926535897931159979634685441851615905761718750000000
But The product n*pi results in a conversion of this to the "exact" symbolic pi before sin( ) is called:
n = sym(n)
n = 
100000000000000000000000000000
n*pi
ans = 
Personally, I prefer to have these silent conversions made explicit in the code so I don't inadvertently get bit downstream. E.g., I typically would calculate this instead up front and use it downstream so there is no possible ambiguity:
sympi = sym('pi')
sympi = 
π

댓글을 달려면 로그인하십시오.


KSSV
KSSV 2022년 7월 21일
n = vpa(100000000000000000000000000000) ;
vpa(sin(n*pi))
ans = 
0.000000000011227417549995295083665533339851
  댓글 수: 1
John D'Errico
John D'Errico 2022년 7월 21일
It is more subtle than you think.
n = vpa(100000000000000000000000000000)
n = 
100000000000000000000000000000.0
vpa(sin(n*pi))
ans = 
0.000000000011227417549995295083665533339851
vpa(sin(n*pi),100)
ans = 
There is a difference.

댓글을 달려면 로그인하십시오.


David Hill
David Hill 2022년 7월 21일
Use symbolics.
function [out] = isInt(n)
n=sym(n);
out=double(sin(n*pi));
end
Call function
o=isInt('10000000000000000000000000000000000000000000000000000000000000000000');
  댓글 수: 1
Emirhan Solmaz
Emirhan Solmaz 2022년 7월 21일
I tried it but it gives a vector as long as the decimal, which are not "0". I am sorry but didn't get it.

댓글을 달려면 로그인하십시오.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by