Increase precision of digits

조회 수: 36 (최근 30일)
Tobi12
Tobi12 2015년 1월 14일
댓글: adi 2019년 12월 9일
I am dealing with numbers around 10^-18. Matlab type double only handles up to 10^-15. Is there a way to increase the number of digits? Many thanks.

채택된 답변

Tobi12
Tobi12 2015년 1월 14일
Thanks for your replies. Sorry, maybe I was not precise enough in my question.
I am dealing with numbers like -0.897214128288675 * (1.0e+03).
For my calculation I need more accuracy than above -> 18 digits after the comma would be excellent.
Also, I am working with arrays...
  댓글 수: 5
Tobi12
Tobi12 2015년 1월 14일
I am now using the sym. tool box. That makes my algorithm increadibly slow.
Isn't there another solution?!?!
Titus Edelhofer
Titus Edelhofer 2015년 1월 14일
Hmm, not really. That's why numerical analysts have been working for decades to think of numerically stable algorithms. As said before, not often you have problems where adding digits is the brute force attempt to save a bad/unstable algorithm from failing (not saying that this is indeed the case for you!).
Sorry,
Titus

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

추가 답변 (2개)

Titus Edelhofer
Titus Edelhofer 2015년 1월 14일
Hi Tobi,
this is not really true:
x = 2e-127;
y = 3e-126;
x*y
ans =
6.0000e-253
I think you mix up the size of numbers and precision? Could it be that your problem is more like
a = 1+1e-18
a =
1
Titus
  댓글 수: 5
Rik
Rik 2019년 12월 8일
No, it only displays as a 1. Try the code below to see that 7 digits is not an issue at all.
val=1+7e-6;
clc
fprintf('%.8f\n',val)
adi
adi 2019년 12월 9일
thank you!

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


Guillaume
Guillaume 2015년 1월 14일
Due to the way double values are stored the accuracy of a double value depends on its magnitude. At 1e-18, that accuracy is around 2e-34:
>> eps(1e-18)
ans =
1.92592994438724e-34
Of course, if the magnitude increases, the accuracy decreases.
>>eps(10)
ans =
1.77635683940025e-15
There is no floating-point data type in matlab with more accuracy than double.
If you want fixed accuracy regardless of the magnitude of the number, you have to use a fixed-point data type (double is floating point). I believe there is a matlab toolbox for that but I don't know anything about it.
Another option is to use java's BigDecimal:
>>n = java.math.BigDecimal(java.math.BigInteger('1'), 24)
n =
1E-24
>>m = n.add(java.math.BigDecimal(10))
m =
10.000000000000000000000001
  댓글 수: 2
Titus Edelhofer
Titus Edelhofer 2015년 1월 14일
Or use variable precision arithmetic from symbolic toolbox, if you need more (relative) accuracy. http://www.mathworks.com/help/releases/R2014b/symbolic/vpa.html
But I would suggest to let us know some more details, most often 16 digits should be enough ...
Titus
John D'Errico
John D'Errico 2015년 1월 14일
편집: John D'Errico 2015년 1월 14일
Or use my HPF toolbox , which does allow your choice of higher precision in a floating point form. It is on the file exchange.
So in 100 decimal digits of precision...
exp(hpf('1.23',100))
ans =
3.421229536289673573790152351452246322159257631512470074140348979345525540446010876820674847912376597
log(ans)
ans =
1.23

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

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

태그

제품

Community Treasure Hunt

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

Start Hunting!

Translated by