Find the precision of a value

21 ビュー (過去 30 日間)
Konstantinos Tsitsilonis
Konstantinos Tsitsilonis 2017 年 7 月 4 日
編集済み: Stephen23 2017 年 9 月 26 日
Hello,
Is there a function in matlab that returns the precision of a number? for example, if I have a number 5.34 i want it to return 0.01, if I have a number 4 I want it to return 1 etc..
Thanks in advance for your answers,
  2 件のコメント
Adam
Adam 2017 年 7 月 4 日
Given that many double-precision numbers cannot be represented to an exact level of accuracy this would be problematic. e.g.
>> a = 5.34
a =
5.34
>> sprintf( '%0.20f', a )
ans =
'5.33999999999999990000'
You would want this to return 0.01 which may be reasonable, but actually the precision (to use your term) of the number is way smaller.
José-Luis
José-Luis 2017 年 7 月 4 日
Your question might make sense if your number is stored as a string, which your using the fprintf tag suggests.

サインインしてコメントする。

採用された回答

Stephen23
Stephen23 2017 年 7 月 4 日
編集済み: Stephen23 2017 年 7 月 4 日
No doubt there will be disagreements over what it means for floating point numbers, but here is one solution which provides the least unexpected output by converting to string, converting the last non-zero digit to 1 and the rest to 0. I do not claim that it is fast, but it does seem to be reasonably robust.
function p = getprecision(x)
f = 14-9*isa(x,'single'); % double/single = 14/5 decimal places.
s = sprintf('%.*e',f,x);
v = [f+2:-1:3,1];
s(v) = '0'+diff([0,cumsum(s(v)~='0')>0]);
p = str2double(s);
end
and tested:
>> getprecision(5.34)
ans = 0.010000
>> getprecision(5)
ans = 1
>> getprecision(53400)
ans = 100
Notes:
  1. keep in mind that 5.34 and 0.01 do not really exist in binary floating point numbers. See Adam's comment.
  2. '%g' is an obvious choice, but is actually more complicated because it can return fixed point values with trailing zeros.
  1 件のコメント
Jan
Jan 2017 年 7 月 4 日
+1: "the least unexpected output" is a nice definition of a "best solution".

サインインしてコメントする。

その他の回答 (2 件)

José-Luis
José-Luis 2017 年 7 月 4 日
Just in case your number is stored as a string:
bla = '5.14';
result = strsplit(bla,'.');
result = numel(result{2})
There are better (faster) ways to do this, but coffee calls.
  2 件のコメント
Stephen23
Stephen23 2017 年 7 月 4 日
編集済み: Stephen23 2017 年 7 月 4 日
What about:
bla = '534000';
bla = '0.000045';
bla = '2463.00000';
José-Luis
José-Luis 2017 年 7 月 4 日
Then a regex() could work.

サインインしてコメントする。


James Tursa
James Tursa 2017 年 7 月 5 日
編集済み: Stephen23 2017 年 9 月 26 日

カテゴリ

Help Center および File ExchangeData Type Conversion についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by